@kestrelfi/lyc-sdk 1.0.1 → 1.0.3
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/README.md +32 -0
- package/dist/carry-XU3WUD22.mjs +20 -0
- package/dist/carry-XU3WUD22.mjs.map +1 -0
- package/dist/chunk-2T23QQCX.mjs +3707 -0
- package/dist/chunk-2T23QQCX.mjs.map +1 -0
- package/dist/chunk-GOW6CARW.mjs +3969 -0
- package/dist/chunk-GOW6CARW.mjs.map +1 -0
- package/dist/chunk-ZPXXY3QV.mjs +9330 -0
- package/dist/chunk-ZPXXY3QV.mjs.map +1 -0
- package/dist/{sdks/long-yield-carry/src/idl/long_yield_carry.d.ts → core-DP6wfpME.d.mts} +3242 -84
- package/dist/core-DP6wfpME.d.ts +10485 -0
- package/dist/core.d.mts +8 -0
- package/dist/core.d.ts +8 -0
- package/dist/core.js +12348 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +72 -0
- package/dist/core.mjs.map +1 -0
- package/dist/index.d.mts +2537 -0
- package/dist/index.d.ts +2537 -0
- package/dist/index.js +23884 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5898 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +56 -10
- package/.env.example +0 -11
- package/dist/sdks/long-yield-carry/scripts/asyncBurn.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/asyncBurn.js +0 -117
- package/dist/sdks/long-yield-carry/scripts/burnToken.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/burnToken.js +0 -98
- package/dist/sdks/long-yield-carry/scripts/claimIncentives.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/claimIncentives.js +0 -108
- package/dist/sdks/long-yield-carry/scripts/closeCpiPlans.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/closeCpiPlans.js +0 -93
- package/dist/sdks/long-yield-carry/scripts/collectInterest.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/collectInterest.js +0 -164
- package/dist/sdks/long-yield-carry/scripts/collectProtocolFees.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/collectProtocolFees.js +0 -120
- package/dist/sdks/long-yield-carry/scripts/computeOptimalAllocations.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/computeOptimalAllocations.js +0 -84
- package/dist/sdks/long-yield-carry/scripts/createToken.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/createToken.js +0 -76
- package/dist/sdks/long-yield-carry/scripts/createTokenLendingPosition.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/createTokenLendingPosition.js +0 -157
- package/dist/sdks/long-yield-carry/scripts/createYieldingBank.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/createYieldingBank.js +0 -69
- package/dist/sdks/long-yield-carry/scripts/decreaseCarryPositions.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/decreaseCarryPositions.js +0 -247
- package/dist/sdks/long-yield-carry/scripts/depositUnlentCollateral.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/depositUnlentCollateral.js +0 -90
- package/dist/sdks/long-yield-carry/scripts/emergency/deleverageAll.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/emergency/deleverageAll.js +0 -202
- package/dist/sdks/long-yield-carry/scripts/emergency/triggerCircuitBreaker.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/emergency/triggerCircuitBreaker.js +0 -68
- package/dist/sdks/long-yield-carry/scripts/env.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/env.js +0 -8
- package/dist/sdks/long-yield-carry/scripts/findTxs.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/findTxs.js +0 -143
- package/dist/sdks/long-yield-carry/scripts/increaseCarryPositions.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/increaseCarryPositions.js +0 -112
- package/dist/sdks/long-yield-carry/scripts/inspect/format.d.ts +0 -13
- package/dist/sdks/long-yield-carry/scripts/inspect/format.js +0 -363
- package/dist/sdks/long-yield-carry/scripts/inspect.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/inspect.js +0 -108
- package/dist/sdks/long-yield-carry/scripts/localUtils.d.ts +0 -53
- package/dist/sdks/long-yield-carry/scripts/localUtils.js +0 -191
- package/dist/sdks/long-yield-carry/scripts/mintToken.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/mintToken.js +0 -103
- package/dist/sdks/long-yield-carry/scripts/processAsyncBurns.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/processAsyncBurns.js +0 -76
- package/dist/sdks/long-yield-carry/scripts/rebalanceToken.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/rebalanceToken.js +0 -210
- package/dist/sdks/long-yield-carry/scripts/rebalanceYieldingBank.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/rebalanceYieldingBank.js +0 -149
- package/dist/sdks/long-yield-carry/scripts/recollateralizeLoss.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/recollateralizeLoss.js +0 -64
- package/dist/sdks/long-yield-carry/scripts/refresh.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/refresh.js +0 -101
- package/dist/sdks/long-yield-carry/scripts/updateFees.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateFees.js +0 -369
- package/dist/sdks/long-yield-carry/scripts/updateGeneralLut.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateGeneralLut.js +0 -27
- package/dist/sdks/long-yield-carry/scripts/updateLendingPositionConfig.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateLendingPositionConfig.js +0 -127
- package/dist/sdks/long-yield-carry/scripts/updateTokenLuts.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateTokenLuts.js +0 -27
- package/dist/sdks/long-yield-carry/scripts/updateTokenMetadata.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateTokenMetadata.js +0 -194
- package/dist/sdks/long-yield-carry/scripts/updateYieldingBankConfig.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/updateYieldingBankConfig.js +0 -84
- package/dist/sdks/long-yield-carry/scripts/withdrawUnlentCollateral.d.ts +0 -1
- package/dist/sdks/long-yield-carry/scripts/withdrawUnlentCollateral.js +0 -140
- package/dist/sdks/long-yield-carry/src/client/account.d.ts +0 -152
- package/dist/sdks/long-yield-carry/src/client/account.js +0 -349
- package/dist/sdks/long-yield-carry/src/client/builders/args.d.ts +0 -299
- package/dist/sdks/long-yield-carry/src/client/builders/args.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/builders/asyncBurnBuilder.d.ts +0 -20
- package/dist/sdks/long-yield-carry/src/client/builders/asyncBurnBuilder.js +0 -212
- package/dist/sdks/long-yield-carry/src/client/builders/base.d.ts +0 -77
- package/dist/sdks/long-yield-carry/src/client/builders/base.js +0 -191
- package/dist/sdks/long-yield-carry/src/client/builders/burnTokenBuilder.d.ts +0 -18
- package/dist/sdks/long-yield-carry/src/client/builders/burnTokenBuilder.js +0 -165
- package/dist/sdks/long-yield-carry/src/client/builders/claimIncentivesBuilder.d.ts +0 -9
- package/dist/sdks/long-yield-carry/src/client/builders/claimIncentivesBuilder.js +0 -135
- package/dist/sdks/long-yield-carry/src/client/builders/collectFeesBuilder.d.ts +0 -14
- package/dist/sdks/long-yield-carry/src/client/builders/collectFeesBuilder.js +0 -50
- package/dist/sdks/long-yield-carry/src/client/builders/collectInterestBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/collectInterestBuilder.js +0 -86
- package/dist/sdks/long-yield-carry/src/client/builders/createCpiPlanBuilder.d.ts +0 -6
- package/dist/sdks/long-yield-carry/src/client/builders/createCpiPlanBuilder.js +0 -22
- package/dist/sdks/long-yield-carry/src/client/builders/createTokenBuilder.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/client/builders/createTokenBuilder.js +0 -64
- package/dist/sdks/long-yield-carry/src/client/builders/createTokenLendingPositionBuilder.d.ts +0 -10
- package/dist/sdks/long-yield-carry/src/client/builders/createTokenLendingPositionBuilder.js +0 -138
- package/dist/sdks/long-yield-carry/src/client/builders/createYieldingBankAllocationBuilder.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/client/builders/createYieldingBankAllocationBuilder.js +0 -29
- package/dist/sdks/long-yield-carry/src/client/builders/createYieldingBankBuilder.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/client/builders/createYieldingBankBuilder.js +0 -39
- package/dist/sdks/long-yield-carry/src/client/builders/decreaseCarryPositionBuilder.d.ts +0 -30
- package/dist/sdks/long-yield-carry/src/client/builders/decreaseCarryPositionBuilder.js +0 -99
- package/dist/sdks/long-yield-carry/src/client/builders/depositUnlentCollateralBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/depositUnlentCollateralBuilder.js +0 -64
- package/dist/sdks/long-yield-carry/src/client/builders/increaseCarryPositionBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/increaseCarryPositionBuilder.js +0 -73
- package/dist/sdks/long-yield-carry/src/client/builders/index.d.ts +0 -28
- package/dist/sdks/long-yield-carry/src/client/builders/index.js +0 -62
- package/dist/sdks/long-yield-carry/src/client/builders/mintTokenBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/mintTokenBuilder.js +0 -95
- package/dist/sdks/long-yield-carry/src/client/builders/rebalanceTokenBuilder.d.ts +0 -11
- package/dist/sdks/long-yield-carry/src/client/builders/rebalanceTokenBuilder.js +0 -255
- package/dist/sdks/long-yield-carry/src/client/builders/rebalanceYieldingBankBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/rebalanceYieldingBankBuilder.js +0 -75
- package/dist/sdks/long-yield-carry/src/client/builders/recollateralizeLossBuilder.d.ts +0 -12
- package/dist/sdks/long-yield-carry/src/client/builders/recollateralizeLossBuilder.js +0 -220
- package/dist/sdks/long-yield-carry/src/client/builders/refreshTokenStateBuilder.d.ts +0 -9
- package/dist/sdks/long-yield-carry/src/client/builders/refreshTokenStateBuilder.js +0 -112
- package/dist/sdks/long-yield-carry/src/client/builders/refreshTokensBuilder.d.ts +0 -9
- package/dist/sdks/long-yield-carry/src/client/builders/refreshTokensBuilder.js +0 -59
- package/dist/sdks/long-yield-carry/src/client/builders/refreshYieldingBankBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/refreshYieldingBankBuilder.js +0 -29
- package/dist/sdks/long-yield-carry/src/client/builders/resetTokenBurnRateLimitBuilder.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/client/builders/resetTokenBurnRateLimitBuilder.js +0 -19
- package/dist/sdks/long-yield-carry/src/client/builders/setTokenCircuitBreakerBuilder.d.ts +0 -11
- package/dist/sdks/long-yield-carry/src/client/builders/setTokenCircuitBreakerBuilder.js +0 -31
- package/dist/sdks/long-yield-carry/src/client/builders/setYieldingBankCircuitBreakerBuilder.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/client/builders/setYieldingBankCircuitBreakerBuilder.js +0 -28
- package/dist/sdks/long-yield-carry/src/client/builders/updateLendingPositionConfigBuilder.d.ts +0 -10
- package/dist/sdks/long-yield-carry/src/client/builders/updateLendingPositionConfigBuilder.js +0 -30
- package/dist/sdks/long-yield-carry/src/client/builders/updateTokenConfigurationBuilder.d.ts +0 -11
- package/dist/sdks/long-yield-carry/src/client/builders/updateTokenConfigurationBuilder.js +0 -47
- package/dist/sdks/long-yield-carry/src/client/builders/updateTokenMetadataBuilder.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/client/builders/updateTokenMetadataBuilder.js +0 -24
- package/dist/sdks/long-yield-carry/src/client/builders/updateYieldingBankConfigBuilder.d.ts +0 -10
- package/dist/sdks/long-yield-carry/src/client/builders/updateYieldingBankConfigBuilder.js +0 -31
- package/dist/sdks/long-yield-carry/src/client/builders/utils.d.ts +0 -4
- package/dist/sdks/long-yield-carry/src/client/builders/utils.js +0 -20
- package/dist/sdks/long-yield-carry/src/client/client.d.ts +0 -115
- package/dist/sdks/long-yield-carry/src/client/client.js +0 -166
- package/dist/sdks/long-yield-carry/src/client/externalLiquidityResolver.d.ts +0 -13
- package/dist/sdks/long-yield-carry/src/client/externalLiquidityResolver.js +0 -34
- package/dist/sdks/long-yield-carry/src/client/index.d.ts +0 -10
- package/dist/sdks/long-yield-carry/src/client/index.js +0 -33
- package/dist/sdks/long-yield-carry/src/client/lendingPlatformClients.d.ts +0 -19
- package/dist/sdks/long-yield-carry/src/client/lendingPlatformClients.js +0 -33
- package/dist/sdks/long-yield-carry/src/client/pda.d.ts +0 -33
- package/dist/sdks/long-yield-carry/src/client/pda.js +0 -79
- package/dist/sdks/long-yield-carry/src/client/plans/collectInterest.d.ts +0 -24
- package/dist/sdks/long-yield-carry/src/client/plans/collectInterest.js +0 -150
- package/dist/sdks/long-yield-carry/src/client/plans/decreaseCarryPosition.d.ts +0 -12
- package/dist/sdks/long-yield-carry/src/client/plans/decreaseCarryPosition.js +0 -140
- package/dist/sdks/long-yield-carry/src/client/routes/collectInterest.d.ts +0 -13
- package/dist/sdks/long-yield-carry/src/client/routes/collectInterest.js +0 -39
- package/dist/sdks/long-yield-carry/src/client/transaction.d.ts +0 -41
- package/dist/sdks/long-yield-carry/src/client/transaction.js +0 -55
- package/dist/sdks/long-yield-carry/src/client/types/builders.d.ts +0 -18
- package/dist/sdks/long-yield-carry/src/client/types/builders.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/enums.d.ts +0 -22
- package/dist/sdks/long-yield-carry/src/client/types/enums.js +0 -48
- package/dist/sdks/long-yield-carry/src/client/types/general.d.ts +0 -98
- package/dist/sdks/long-yield-carry/src/client/types/general.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/index.d.ts +0 -6
- package/dist/sdks/long-yield-carry/src/client/types/index.js +0 -22
- package/dist/sdks/long-yield-carry/src/client/types/ix.d.ts +0 -352
- package/dist/sdks/long-yield-carry/src/client/types/ix.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/collectInterest.d.ts +0 -91
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/collectInterest.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/common.d.ts +0 -28
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/common.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/decreaseCarryPosition.d.ts +0 -128
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/decreaseCarryPosition.js +0 -2
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/index.d.ts +0 -3
- package/dist/sdks/long-yield-carry/src/client/types/planTypes/index.js +0 -19
- package/dist/sdks/long-yield-carry/src/client/types/tx.d.ts +0 -339
- package/dist/sdks/long-yield-carry/src/client/types/tx.js +0 -2
- package/dist/sdks/long-yield-carry/src/constants/configs/allocations.d.ts +0 -3
- package/dist/sdks/long-yield-carry/src/constants/configs/allocations.js +0 -23
- package/dist/sdks/long-yield-carry/src/constants/configs/carryTradePresets.d.ts +0 -58
- package/dist/sdks/long-yield-carry/src/constants/configs/carryTradePresets.js +0 -116
- package/dist/sdks/long-yield-carry/src/constants/configs/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/constants/configs/index.js +0 -18
- package/dist/sdks/long-yield-carry/src/constants/general.d.ts +0 -70
- package/dist/sdks/long-yield-carry/src/constants/general.js +0 -107
- package/dist/sdks/long-yield-carry/src/constants/index.d.ts +0 -3
- package/dist/sdks/long-yield-carry/src/constants/index.js +0 -19
- package/dist/sdks/long-yield-carry/src/constants/lycTokenMetadata.d.ts +0 -36
- package/dist/sdks/long-yield-carry/src/constants/lycTokenMetadata.js +0 -41
- package/dist/sdks/long-yield-carry/src/decoders/decodeTransaction.d.ts +0 -86
- package/dist/sdks/long-yield-carry/src/decoders/decodeTransaction.js +0 -230
- package/dist/sdks/long-yield-carry/src/decoders/discriminators.d.ts +0 -8
- package/dist/sdks/long-yield-carry/src/decoders/discriminators.js +0 -11
- package/dist/sdks/long-yield-carry/src/decoders/idlAccounts.d.ts +0 -29
- package/dist/sdks/long-yield-carry/src/decoders/idlAccounts.js +0 -57
- package/dist/sdks/long-yield-carry/src/decoders/index.d.ts +0 -6
- package/dist/sdks/long-yield-carry/src/decoders/index.js +0 -14
- package/dist/sdks/long-yield-carry/src/decoders/innerCpis.d.ts +0 -68
- package/dist/sdks/long-yield-carry/src/decoders/innerCpis.js +0 -225
- package/dist/sdks/long-yield-carry/src/decoders/lycInstructionNames.d.ts +0 -6
- package/dist/sdks/long-yield-carry/src/decoders/lycInstructionNames.js +0 -73
- package/dist/sdks/long-yield-carry/src/decoders/programIds.d.ts +0 -4
- package/dist/sdks/long-yield-carry/src/decoders/programIds.js +0 -11
- package/dist/sdks/long-yield-carry/src/decoders/solana.d.ts +0 -7
- package/dist/sdks/long-yield-carry/src/decoders/solana.js +0 -30
- package/dist/sdks/long-yield-carry/src/decoders/transactionPayload.d.ts +0 -41
- package/dist/sdks/long-yield-carry/src/decoders/transactionPayload.js +0 -6
- package/dist/sdks/long-yield-carry/src/decoders/types.d.ts +0 -58
- package/dist/sdks/long-yield-carry/src/decoders/types.js +0 -2
- package/dist/sdks/long-yield-carry/src/errors.d.ts +0 -69
- package/dist/sdks/long-yield-carry/src/errors.js +0 -183
- package/dist/sdks/long-yield-carry/src/idl/long_yield_carry.js +0 -7323
- package/dist/sdks/long-yield-carry/src/index.d.ts +0 -10
- package/dist/sdks/long-yield-carry/src/index.js +0 -25
- package/dist/sdks/long-yield-carry/src/metrics/index.d.ts +0 -1
- package/dist/sdks/long-yield-carry/src/metrics/index.js +0 -17
- package/dist/sdks/long-yield-carry/src/metrics/protocolMetrics.d.ts +0 -276
- package/dist/sdks/long-yield-carry/src/metrics/protocolMetrics.js +0 -547
- package/dist/sdks/long-yield-carry/src/models/index.d.ts +0 -3
- package/dist/sdks/long-yield-carry/src/models/index.js +0 -7
- package/dist/sdks/long-yield-carry/src/models/lycToken.d.ts +0 -156
- package/dist/sdks/long-yield-carry/src/models/lycToken.js +0 -288
- package/dist/sdks/long-yield-carry/src/models/yieldingBank.d.ts +0 -52
- package/dist/sdks/long-yield-carry/src/models/yieldingBank.js +0 -109
- package/dist/sdks/long-yield-carry/src/services/allocation/allocationService.d.ts +0 -106
- package/dist/sdks/long-yield-carry/src/services/allocation/allocationService.js +0 -589
- package/dist/sdks/long-yield-carry/src/services/allocation/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/services/allocation/index.js +0 -18
- package/dist/sdks/long-yield-carry/src/services/allocation/types.d.ts +0 -25
- package/dist/sdks/long-yield-carry/src/services/allocation/types.js +0 -2
- package/dist/sdks/long-yield-carry/src/services/carry/carryAllocationConfig.d.ts +0 -103
- package/dist/sdks/long-yield-carry/src/services/carry/carryAllocationConfig.js +0 -146
- package/dist/sdks/long-yield-carry/src/services/carry/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/services/carry/index.js +0 -18
- package/dist/sdks/long-yield-carry/src/services/carry/lycLendingPositionManager.d.ts +0 -39
- package/dist/sdks/long-yield-carry/src/services/carry/lycLendingPositionManager.js +0 -100
- package/dist/sdks/long-yield-carry/src/services/index.d.ts +0 -5
- package/dist/sdks/long-yield-carry/src/services/index.js +0 -21
- package/dist/sdks/long-yield-carry/src/services/lendingPosition/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/services/lendingPosition/index.js +0 -5
- package/dist/sdks/long-yield-carry/src/services/lendingPosition/lendingPositionService.d.ts +0 -88
- package/dist/sdks/long-yield-carry/src/services/lendingPosition/lendingPositionService.js +0 -229
- package/dist/sdks/long-yield-carry/src/services/rebalance/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/services/rebalance/index.js +0 -18
- package/dist/sdks/long-yield-carry/src/services/rebalance/token/index.d.ts +0 -1
- package/dist/sdks/long-yield-carry/src/services/rebalance/token/index.js +0 -17
- package/dist/sdks/long-yield-carry/src/services/rebalance/token/tokenRebalanceService.d.ts +0 -51
- package/dist/sdks/long-yield-carry/src/services/rebalance/token/tokenRebalanceService.js +0 -99
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/index.d.ts +0 -3
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/index.js +0 -21
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/planner.d.ts +0 -68
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/planner.js +0 -181
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/strategy.d.ts +0 -26
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/strategy.js +0 -26
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/types.d.ts +0 -40
- package/dist/sdks/long-yield-carry/src/services/rebalance/yieldingBank/types.js +0 -2
- package/dist/sdks/long-yield-carry/src/services/redemption/index.d.ts +0 -2
- package/dist/sdks/long-yield-carry/src/services/redemption/index.js +0 -5
- package/dist/sdks/long-yield-carry/src/services/redemption/redemptionService.d.ts +0 -139
- package/dist/sdks/long-yield-carry/src/services/redemption/redemptionService.js +0 -532
- package/dist/sdks/long-yield-carry/src/types/enriched.d.ts +0 -168
- package/dist/sdks/long-yield-carry/src/types/enriched.js +0 -2
- package/dist/sdks/long-yield-carry/src/types/index.d.ts +0 -1
- package/dist/sdks/long-yield-carry/src/types/index.js +0 -17
- package/dist/sdks/long-yield-carry/src/utils/cache.d.ts +0 -4
- package/dist/sdks/long-yield-carry/src/utils/cache.js +0 -10
- package/dist/sdks/long-yield-carry/src/utils/data.d.ts +0 -12
- package/dist/sdks/long-yield-carry/src/utils/data.js +0 -59
- package/dist/sdks/long-yield-carry/src/utils/enrichment.d.ts +0 -5
- package/dist/sdks/long-yield-carry/src/utils/enrichment.js +0 -244
- package/dist/sdks/long-yield-carry/src/utils/feeDripMetrics.d.ts +0 -36
- package/dist/sdks/long-yield-carry/src/utils/feeDripMetrics.js +0 -93
- package/dist/sdks/long-yield-carry/src/utils/general.d.ts +0 -28
- package/dist/sdks/long-yield-carry/src/utils/general.js +0 -47
- package/dist/sdks/long-yield-carry/src/utils/index.d.ts +0 -13
- package/dist/sdks/long-yield-carry/src/utils/index.js +0 -29
- package/dist/sdks/long-yield-carry/src/utils/ix.d.ts +0 -83
- package/dist/sdks/long-yield-carry/src/utils/ix.js +0 -165
- package/dist/sdks/long-yield-carry/src/utils/lendingPosition.d.ts +0 -68
- package/dist/sdks/long-yield-carry/src/utils/lendingPosition.js +0 -105
- package/dist/sdks/long-yield-carry/src/utils/lookupTables.d.ts +0 -55
- package/dist/sdks/long-yield-carry/src/utils/lookupTables.js +0 -216
- package/dist/sdks/long-yield-carry/src/utils/lycData.d.ts +0 -66
- package/dist/sdks/long-yield-carry/src/utils/lycData.js +0 -211
- package/dist/sdks/long-yield-carry/src/utils/timelock.d.ts +0 -19
- package/dist/sdks/long-yield-carry/src/utils/timelock.js +0 -37
- package/dist/sdks/long-yield-carry/src/utils/tokenFeeMath.d.ts +0 -11
- package/dist/sdks/long-yield-carry/src/utils/tokenFeeMath.js +0 -24
- package/dist/sdks/long-yield-carry/src/utils/transactions.d.ts +0 -20
- package/dist/sdks/long-yield-carry/src/utils/transactions.js +0 -72
- package/dist/sdks/long-yield-carry/src/utils/yieldingBank.d.ts +0 -24
- package/dist/sdks/long-yield-carry/src/utils/yieldingBank.js +0 -36
- package/dist/shared/common/src/constants/accountMetas.d.ts +0 -3
- package/dist/shared/common/src/constants/accountMetas.js +0 -9
- package/dist/shared/common/src/constants/general.d.ts +0 -21
- package/dist/shared/common/src/constants/general.js +0 -30
- package/dist/shared/common/src/constants/generated/cpi.d.ts +0 -23
- package/dist/shared/common/src/constants/generated/cpi.js +0 -28
- package/dist/shared/common/src/constants/generated/index.d.ts +0 -1
- package/dist/shared/common/src/constants/generated/index.js +0 -17
- package/dist/shared/common/src/constants/index.d.ts +0 -3
- package/dist/shared/common/src/constants/index.js +0 -19
- package/dist/shared/common/src/index.d.ts +0 -4
- package/dist/shared/common/src/index.js +0 -20
- package/dist/shared/common/src/services/baseAccountClient.d.ts +0 -22
- package/dist/shared/common/src/services/baseAccountClient.js +0 -38
- package/dist/shared/common/src/services/baseIxBuilderService.d.ts +0 -27
- package/dist/shared/common/src/services/baseIxBuilderService.js +0 -48
- package/dist/shared/common/src/services/dataCache.d.ts +0 -41
- package/dist/shared/common/src/services/dataCache.js +0 -130
- package/dist/shared/common/src/services/index.d.ts +0 -8
- package/dist/shared/common/src/services/index.js +0 -24
- package/dist/shared/common/src/services/lutManager.d.ts +0 -31
- package/dist/shared/common/src/services/lutManager.js +0 -133
- package/dist/shared/common/src/services/mints/defaults.d.ts +0 -2
- package/dist/shared/common/src/services/mints/defaults.js +0 -152
- package/dist/shared/common/src/services/mints/index.d.ts +0 -4
- package/dist/shared/common/src/services/mints/index.js +0 -20
- package/dist/shared/common/src/services/mints/registry.d.ts +0 -70
- package/dist/shared/common/src/services/mints/registry.js +0 -117
- package/dist/shared/common/src/services/mints/symbols.d.ts +0 -6
- package/dist/shared/common/src/services/mints/symbols.js +0 -13
- package/dist/shared/common/src/services/mints/types.d.ts +0 -30
- package/dist/shared/common/src/services/mints/types.js +0 -2
- package/dist/shared/common/src/services/swap/index.d.ts +0 -4
- package/dist/shared/common/src/services/swap/index.js +0 -20
- package/dist/shared/common/src/services/swap/routableSwapClient.d.ts +0 -36
- package/dist/shared/common/src/services/swap/routableSwapClient.js +0 -2
- package/dist/shared/common/src/services/swap/swapClientBase.d.ts +0 -45
- package/dist/shared/common/src/services/swap/swapClientBase.js +0 -2
- package/dist/shared/common/src/services/swap/swapRouting.d.ts +0 -13
- package/dist/shared/common/src/services/swap/swapRouting.js +0 -28
- package/dist/shared/common/src/services/swap/types.d.ts +0 -77
- package/dist/shared/common/src/services/swap/types.js +0 -2
- package/dist/shared/common/src/services/token/index.d.ts +0 -2
- package/dist/shared/common/src/services/token/index.js +0 -18
- package/dist/shared/common/src/services/token/tokenProtocolClientBase.d.ts +0 -51
- package/dist/shared/common/src/services/token/tokenProtocolClientBase.js +0 -2
- package/dist/shared/common/src/services/token/types.d.ts +0 -19
- package/dist/shared/common/src/services/token/types.js +0 -2
- package/dist/shared/common/src/services/transactionSender.d.ts +0 -24
- package/dist/shared/common/src/services/transactionSender.js +0 -30
- package/dist/shared/common/src/types/cpi.d.ts +0 -34
- package/dist/shared/common/src/types/cpi.js +0 -8
- package/dist/shared/common/src/types/enums.d.ts +0 -59
- package/dist/shared/common/src/types/enums.js +0 -122
- package/dist/shared/common/src/types/general.d.ts +0 -38
- package/dist/shared/common/src/types/general.js +0 -2
- package/dist/shared/common/src/types/index.d.ts +0 -4
- package/dist/shared/common/src/types/index.js +0 -20
- package/dist/shared/common/src/types/solana.d.ts +0 -24
- package/dist/shared/common/src/types/solana.js +0 -2
- package/dist/shared/common/src/utils/accounts/index.d.ts +0 -5
- package/dist/shared/common/src/utils/accounts/index.js +0 -21
- package/dist/shared/common/src/utils/accounts/meta.d.ts +0 -21
- package/dist/shared/common/src/utils/accounts/meta.js +0 -27
- package/dist/shared/common/src/utils/accounts/pda.d.ts +0 -2
- package/dist/shared/common/src/utils/accounts/pda.js +0 -17
- package/dist/shared/common/src/utils/accounts/roles.d.ts +0 -26
- package/dist/shared/common/src/utils/accounts/roles.js +0 -54
- package/dist/shared/common/src/utils/accounts/rpc.d.ts +0 -8
- package/dist/shared/common/src/utils/accounts/rpc.js +0 -30
- package/dist/shared/common/src/utils/accounts/splBalances.d.ts +0 -15
- package/dist/shared/common/src/utils/accounts/splBalances.js +0 -52
- package/dist/shared/common/src/utils/anchor.d.ts +0 -17
- package/dist/shared/common/src/utils/anchor.js +0 -29
- package/dist/shared/common/src/utils/asyncConcurrency.d.ts +0 -5
- package/dist/shared/common/src/utils/asyncConcurrency.js +0 -28
- package/dist/shared/common/src/utils/compat.d.ts +0 -46
- package/dist/shared/common/src/utils/compat.js +0 -72
- package/dist/shared/common/src/utils/cpi/args.d.ts +0 -69
- package/dist/shared/common/src/utils/cpi/args.js +0 -100
- package/dist/shared/common/src/utils/cpi/index.d.ts +0 -2
- package/dist/shared/common/src/utils/cpi/index.js +0 -18
- package/dist/shared/common/src/utils/cpi/refs.d.ts +0 -122
- package/dist/shared/common/src/utils/cpi/refs.js +0 -234
- package/dist/shared/common/src/utils/data.d.ts +0 -20
- package/dist/shared/common/src/utils/data.js +0 -27
- package/dist/shared/common/src/utils/general.d.ts +0 -24
- package/dist/shared/common/src/utils/general.js +0 -95
- package/dist/shared/common/src/utils/index.d.ts +0 -22
- package/dist/shared/common/src/utils/index.js +0 -38
- package/dist/shared/common/src/utils/instruction.d.ts +0 -74
- package/dist/shared/common/src/utils/instruction.js +0 -147
- package/dist/shared/common/src/utils/jito.d.ts +0 -113
- package/dist/shared/common/src/utils/jito.js +0 -178
- package/dist/shared/common/src/utils/json.d.ts +0 -5
- package/dist/shared/common/src/utils/json.js +0 -25
- package/dist/shared/common/src/utils/jsonRpcFetch.d.ts +0 -21
- package/dist/shared/common/src/utils/jsonRpcFetch.js +0 -134
- package/dist/shared/common/src/utils/metadata.d.ts +0 -107
- package/dist/shared/common/src/utils/metadata.js +0 -194
- package/dist/shared/common/src/utils/numbers.d.ts +0 -72
- package/dist/shared/common/src/utils/numbers.js +0 -193
- package/dist/shared/common/src/utils/priorityFee.d.ts +0 -18
- package/dist/shared/common/src/utils/priorityFee.js +0 -63
- package/dist/shared/common/src/utils/retry.d.ts +0 -20
- package/dist/shared/common/src/utils/retry.js +0 -69
- package/dist/shared/common/src/utils/rpc.d.ts +0 -40
- package/dist/shared/common/src/utils/rpc.js +0 -130
- package/dist/shared/common/src/utils/solana.d.ts +0 -23
- package/dist/shared/common/src/utils/solana.js +0 -61
- package/dist/shared/common/src/utils/timeSeries.d.ts +0 -18
- package/dist/shared/common/src/utils/timeSeries.js +0 -40
- package/dist/shared/common/src/utils/token.d.ts +0 -33
- package/dist/shared/common/src/utils/token.js +0 -82
- package/dist/shared/common/src/utils/transaction.d.ts +0 -154
- package/dist/shared/common/src/utils/transaction.js +0 -585
- package/dist/shared/common/src/utils/transactionSplitter.d.ts +0 -85
- package/dist/shared/common/src/utils/transactionSplitter.js +0 -127
- package/dist/shared/common/src/utils/txAccountCoverage.d.ts +0 -49
- package/dist/shared/common/src/utils/txAccountCoverage.js +0 -122
- package/dist/shared/jupiter-helpers/src/api.d.ts +0 -59
- package/dist/shared/jupiter-helpers/src/api.js +0 -130
- package/dist/shared/jupiter-helpers/src/client.d.ts +0 -79
- package/dist/shared/jupiter-helpers/src/client.js +0 -173
- package/dist/shared/jupiter-helpers/src/constants.d.ts +0 -35
- package/dist/shared/jupiter-helpers/src/constants.js +0 -38
- package/dist/shared/jupiter-helpers/src/extract.d.ts +0 -30
- package/dist/shared/jupiter-helpers/src/extract.js +0 -57
- package/dist/shared/jupiter-helpers/src/index.d.ts +0 -5
- package/dist/shared/jupiter-helpers/src/index.js +0 -21
- package/dist/shared/jupiter-helpers/src/routePreInstructions.d.ts +0 -19
- package/dist/shared/jupiter-helpers/src/routePreInstructions.js +0 -61
- package/dist/shared/jupiter-helpers/src/sizeExactInForMinOutput.d.ts +0 -70
- package/dist/shared/jupiter-helpers/src/sizeExactInForMinOutput.js +0 -95
- package/dist/shared/jupiter-helpers/src/types.d.ts +0 -66
- package/dist/shared/jupiter-helpers/src/types.js +0 -2
- package/dist/shared/lending-platforms/src/constants/cache.d.ts +0 -8
- package/dist/shared/lending-platforms/src/constants/cache.js +0 -11
- package/dist/shared/lending-platforms/src/constants/index.d.ts +0 -3
- package/dist/shared/lending-platforms/src/constants/index.js +0 -19
- package/dist/shared/lending-platforms/src/constants/kamino.d.ts +0 -7
- package/dist/shared/lending-platforms/src/constants/kamino.js +0 -83
- package/dist/shared/lending-platforms/src/constants/lendingPosition.d.ts +0 -7
- package/dist/shared/lending-platforms/src/constants/lendingPosition.js +0 -10
- package/dist/shared/lending-platforms/src/data/accounts/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/data/accounts/index.js +0 -18
- package/dist/shared/lending-platforms/src/data/accounts/kamino.d.ts +0 -42
- package/dist/shared/lending-platforms/src/data/accounts/kamino.js +0 -104
- package/dist/shared/lending-platforms/src/data/accounts/lpAccountsBase.d.ts +0 -7
- package/dist/shared/lending-platforms/src/data/accounts/lpAccountsBase.js +0 -9
- package/dist/shared/lending-platforms/src/data/incentive/incentiveBase.d.ts +0 -35
- package/dist/shared/lending-platforms/src/data/incentive/incentiveBase.js +0 -26
- package/dist/shared/lending-platforms/src/data/incentive/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/data/incentive/index.js +0 -18
- package/dist/shared/lending-platforms/src/data/incentive/kamino.d.ts +0 -55
- package/dist/shared/lending-platforms/src/data/incentive/kamino.js +0 -101
- package/dist/shared/lending-platforms/src/data/index.d.ts +0 -6
- package/dist/shared/lending-platforms/src/data/index.js +0 -22
- package/dist/shared/lending-platforms/src/data/instructions/index.d.ts +0 -3
- package/dist/shared/lending-platforms/src/data/instructions/index.js +0 -19
- package/dist/shared/lending-platforms/src/data/instructions/kamino.d.ts +0 -55
- package/dist/shared/lending-platforms/src/data/instructions/kamino.js +0 -630
- package/dist/shared/lending-platforms/src/data/instructions/lpInstructionsBase.d.ts +0 -175
- package/dist/shared/lending-platforms/src/data/instructions/lpInstructionsBase.js +0 -192
- package/dist/shared/lending-platforms/src/data/instructions/types.d.ts +0 -7
- package/dist/shared/lending-platforms/src/data/instructions/types.js +0 -2
- package/dist/shared/lending-platforms/src/data/platform/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/data/platform/index.js +0 -18
- package/dist/shared/lending-platforms/src/data/platform/kamino.d.ts +0 -59
- package/dist/shared/lending-platforms/src/data/platform/kamino.js +0 -206
- package/dist/shared/lending-platforms/src/data/platform/lpDataBase.d.ts +0 -35
- package/dist/shared/lending-platforms/src/data/platform/lpDataBase.js +0 -31
- package/dist/shared/lending-platforms/src/data/reserve/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/data/reserve/index.js +0 -18
- package/dist/shared/lending-platforms/src/data/reserve/kamino.d.ts +0 -45
- package/dist/shared/lending-platforms/src/data/reserve/kamino.js +0 -141
- package/dist/shared/lending-platforms/src/data/reserve/reserveBase.d.ts +0 -114
- package/dist/shared/lending-platforms/src/data/reserve/reserveBase.js +0 -125
- package/dist/shared/lending-platforms/src/data/userPosition/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/data/userPosition/index.js +0 -18
- package/dist/shared/lending-platforms/src/data/userPosition/kamino.d.ts +0 -15
- package/dist/shared/lending-platforms/src/data/userPosition/kamino.js +0 -45
- package/dist/shared/lending-platforms/src/data/userPosition/userPositionBase.d.ts +0 -50
- package/dist/shared/lending-platforms/src/data/userPosition/userPositionBase.js +0 -63
- package/dist/shared/lending-platforms/src/index.d.ts +0 -5
- package/dist/shared/lending-platforms/src/index.js +0 -21
- package/dist/shared/lending-platforms/src/services/client/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/services/client/index.js +0 -18
- package/dist/shared/lending-platforms/src/services/client/kamino.d.ts +0 -53
- package/dist/shared/lending-platforms/src/services/client/kamino.js +0 -142
- package/dist/shared/lending-platforms/src/services/client/lpClientBase.d.ts +0 -66
- package/dist/shared/lending-platforms/src/services/client/lpClientBase.js +0 -19
- package/dist/shared/lending-platforms/src/services/flashLoan/flashLoanBase.d.ts +0 -49
- package/dist/shared/lending-platforms/src/services/flashLoan/flashLoanBase.js +0 -16
- package/dist/shared/lending-platforms/src/services/flashLoan/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/services/flashLoan/index.js +0 -18
- package/dist/shared/lending-platforms/src/services/flashLoan/kamino.d.ts +0 -11
- package/dist/shared/lending-platforms/src/services/flashLoan/kamino.js +0 -85
- package/dist/shared/lending-platforms/src/services/index.d.ts +0 -5
- package/dist/shared/lending-platforms/src/services/index.js +0 -21
- package/dist/shared/lending-platforms/src/services/lendingPosition/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/services/lendingPosition/index.js +0 -18
- package/dist/shared/lending-platforms/src/services/lendingPosition/lendingPositionManager.d.ts +0 -117
- package/dist/shared/lending-platforms/src/services/lendingPosition/lendingPositionManager.js +0 -342
- package/dist/shared/lending-platforms/src/services/lendingPosition/types.d.ts +0 -40
- package/dist/shared/lending-platforms/src/services/lendingPosition/types.js +0 -2
- package/dist/shared/lending-platforms/src/services/leverage/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/services/leverage/index.js +0 -18
- package/dist/shared/lending-platforms/src/services/leverage/leverageService.d.ts +0 -104
- package/dist/shared/lending-platforms/src/services/leverage/leverageService.js +0 -437
- package/dist/shared/lending-platforms/src/services/leverage/types.d.ts +0 -261
- package/dist/shared/lending-platforms/src/services/leverage/types.js +0 -2
- package/dist/shared/lending-platforms/src/services/reservesManager.d.ts +0 -53
- package/dist/shared/lending-platforms/src/services/reservesManager.js +0 -112
- package/dist/shared/lending-platforms/src/types/general.d.ts +0 -37
- package/dist/shared/lending-platforms/src/types/general.js +0 -8
- package/dist/shared/lending-platforms/src/types/index.d.ts +0 -2
- package/dist/shared/lending-platforms/src/types/index.js +0 -18
- package/dist/shared/lending-platforms/src/types/kamino.d.ts +0 -10
- package/dist/shared/lending-platforms/src/types/kamino.js +0 -2
- package/dist/shared/lending-platforms/src/utils/accounts.d.ts +0 -16
- package/dist/shared/lending-platforms/src/utils/accounts.js +0 -36
- package/dist/shared/lending-platforms/src/utils/cache.d.ts +0 -3
- package/dist/shared/lending-platforms/src/utils/cache.js +0 -11
- package/dist/shared/lending-platforms/src/utils/index.d.ts +0 -6
- package/dist/shared/lending-platforms/src/utils/index.js +0 -22
- package/dist/shared/lending-platforms/src/utils/kamino.d.ts +0 -87
- package/dist/shared/lending-platforms/src/utils/kamino.js +0 -190
- package/dist/shared/lending-platforms/src/utils/lendingPlatform.d.ts +0 -6
- package/dist/shared/lending-platforms/src/utils/lendingPlatform.js +0 -16
- package/dist/shared/lending-platforms/src/utils/math.d.ts +0 -47
- package/dist/shared/lending-platforms/src/utils/math.js +0 -123
- package/dist/shared/lending-platforms/src/utils/scope.d.ts +0 -38
- package/dist/shared/lending-platforms/src/utils/scope.js +0 -144
- package/dist/shared/oracle-service/src/constants/index.d.ts +0 -3
- package/dist/shared/oracle-service/src/constants/index.js +0 -19
- package/dist/shared/oracle-service/src/constants/pyth.d.ts +0 -7
- package/dist/shared/oracle-service/src/constants/pyth.js +0 -71
- package/dist/shared/oracle-service/src/constants/splStake.d.ts +0 -2
- package/dist/shared/oracle-service/src/constants/splStake.js +0 -6
- package/dist/shared/oracle-service/src/constants/switchboard.d.ts +0 -7
- package/dist/shared/oracle-service/src/constants/switchboard.js +0 -10
- package/dist/shared/oracle-service/src/feeds/custom.d.ts +0 -30
- package/dist/shared/oracle-service/src/feeds/custom.js +0 -56
- package/dist/shared/oracle-service/src/feeds/jupiter.d.ts +0 -7
- package/dist/shared/oracle-service/src/feeds/jupiter.js +0 -43
- package/dist/shared/oracle-service/src/feeds/priceBase.d.ts +0 -13
- package/dist/shared/oracle-service/src/feeds/priceBase.js +0 -25
- package/dist/shared/oracle-service/src/feeds/pyth.d.ts +0 -8
- package/dist/shared/oracle-service/src/feeds/pyth.js +0 -59
- package/dist/shared/oracle-service/src/feeds/splStake.d.ts +0 -26
- package/dist/shared/oracle-service/src/feeds/splStake.js +0 -99
- package/dist/shared/oracle-service/src/feeds/switchboard.d.ts +0 -6
- package/dist/shared/oracle-service/src/feeds/switchboard.js +0 -11
- package/dist/shared/oracle-service/src/index.d.ts +0 -5
- package/dist/shared/oracle-service/src/index.js +0 -26
- package/dist/shared/oracle-service/src/oracle.d.ts +0 -22
- package/dist/shared/oracle-service/src/oracle.js +0 -104
- package/dist/shared/oracle-service/src/types.d.ts +0 -4
- package/dist/shared/oracle-service/src/types.js +0 -2
- package/dist/shared/oracle-service/src/utils/general.d.ts +0 -20
- package/dist/shared/oracle-service/src/utils/general.js +0 -65
- package/dist/shared/oracle-service/src/utils/index.d.ts +0 -1
- package/dist/shared/oracle-service/src/utils/index.js +0 -17
- package/dist/shared/perena-helpers/src/accounts.d.ts +0 -7
- package/dist/shared/perena-helpers/src/accounts.js +0 -12
- package/dist/shared/perena-helpers/src/client.d.ts +0 -299
- package/dist/shared/perena-helpers/src/client.js +0 -680
- package/dist/shared/perena-helpers/src/constants.d.ts +0 -5
- package/dist/shared/perena-helpers/src/constants.js +0 -8
- package/dist/shared/perena-helpers/src/cpi/burn.d.ts +0 -27
- package/dist/shared/perena-helpers/src/cpi/burn.js +0 -22
- package/dist/shared/perena-helpers/src/cpi/index.d.ts +0 -3
- package/dist/shared/perena-helpers/src/cpi/index.js +0 -19
- package/dist/shared/perena-helpers/src/cpi/mint.d.ts +0 -27
- package/dist/shared/perena-helpers/src/cpi/mint.js +0 -22
- package/dist/shared/perena-helpers/src/cpi/requestUnstake.d.ts +0 -19
- package/dist/shared/perena-helpers/src/cpi/requestUnstake.js +0 -16
- package/dist/shared/perena-helpers/src/index.d.ts +0 -5
- package/dist/shared/perena-helpers/src/index.js +0 -21
- package/dist/shared/perena-helpers/src/utils.d.ts +0 -9
- package/dist/shared/perena-helpers/src/utils.js +0 -54
- package/dist/shared/swap-aggregator/src/aggSwapClient.d.ts +0 -71
- package/dist/shared/swap-aggregator/src/aggSwapClient.js +0 -103
- package/dist/shared/swap-aggregator/src/index.d.ts +0 -1
- package/dist/shared/swap-aggregator/src/index.js +0 -17
- package/docs/launchingToken.md +0 -57
- package/scripts/asyncBurn.ts +0 -155
- package/scripts/burnToken.ts +0 -120
- package/scripts/claimIncentives.ts +0 -125
- package/scripts/closeCpiPlans.ts +0 -113
- package/scripts/collectInterest.ts +0 -194
- package/scripts/collectProtocolFees.ts +0 -144
- package/scripts/computeOptimalAllocations.ts +0 -117
- package/scripts/createToken.ts +0 -100
- package/scripts/createTokenLendingPosition.ts +0 -204
- package/scripts/createYieldingBank.ts +0 -91
- package/scripts/decreaseCarryPositions.ts +0 -359
- package/scripts/depositUnlentCollateral.ts +0 -106
- package/scripts/emergency/deleverageAll.ts +0 -287
- package/scripts/emergency/triggerCircuitBreaker.ts +0 -87
- package/scripts/env.ts +0 -4
- package/scripts/findTxs.ts +0 -169
- package/scripts/increaseCarryPositions.ts +0 -134
- package/scripts/inspect/format.ts +0 -576
- package/scripts/inspect.ts +0 -147
- package/scripts/localUtils.ts +0 -249
- package/scripts/mintToken.ts +0 -126
- package/scripts/processAsyncBurns.ts +0 -89
- package/scripts/rebalanceToken.ts +0 -269
- package/scripts/rebalanceYieldingBank.ts +0 -183
- package/scripts/recollateralizeLoss.ts +0 -79
- package/scripts/refresh.ts +0 -156
- package/scripts/updateFees.ts +0 -486
- package/scripts/updateGeneralLut.ts +0 -36
- package/scripts/updateLendingPositionConfig.ts +0 -172
- package/scripts/updateTokenLuts.ts +0 -36
- package/scripts/updateTokenMetadata.ts +0 -199
- package/scripts/updateYieldingBankConfig.ts +0 -100
- package/scripts/withdrawUnlentCollateral.ts +0 -178
- package/src/client/account.ts +0 -503
- package/src/client/builders/args.ts +0 -381
- package/src/client/builders/asyncBurnBuilder.ts +0 -305
- package/src/client/builders/base.ts +0 -303
- package/src/client/builders/burnTokenBuilder.ts +0 -258
- package/src/client/builders/claimIncentivesBuilder.ts +0 -211
- package/src/client/builders/collectFeesBuilder.ts +0 -52
- package/src/client/builders/collectInterestBuilder.ts +0 -165
- package/src/client/builders/createCpiPlanBuilder.ts +0 -21
- package/src/client/builders/createTokenBuilder.ts +0 -73
- package/src/client/builders/createTokenLendingPositionBuilder.ts +0 -219
- package/src/client/builders/createYieldingBankAllocationBuilder.ts +0 -32
- package/src/client/builders/createYieldingBankBuilder.ts +0 -39
- package/src/client/builders/decreaseCarryPositionBuilder.ts +0 -162
- package/src/client/builders/depositUnlentCollateralBuilder.ts +0 -95
- package/src/client/builders/increaseCarryPositionBuilder.ts +0 -105
- package/src/client/builders/index.ts +0 -37
- package/src/client/builders/mintTokenBuilder.ts +0 -137
- package/src/client/builders/rebalanceTokenBuilder.ts +0 -356
- package/src/client/builders/rebalanceYieldingBankBuilder.ts +0 -109
- package/src/client/builders/recollateralizeLossBuilder.ts +0 -367
- package/src/client/builders/refreshTokenStateBuilder.ts +0 -153
- package/src/client/builders/refreshTokensBuilder.ts +0 -82
- package/src/client/builders/refreshYieldingBankBuilder.ts +0 -42
- package/src/client/builders/resetTokenBurnRateLimitBuilder.ts +0 -21
- package/src/client/builders/setTokenCircuitBreakerBuilder.ts +0 -40
- package/src/client/builders/setYieldingBankCircuitBreakerBuilder.ts +0 -37
- package/src/client/builders/updateLendingPositionConfigBuilder.ts +0 -33
- package/src/client/builders/updateTokenConfigurationBuilder.ts +0 -50
- package/src/client/builders/updateTokenMetadataBuilder.ts +0 -24
- package/src/client/builders/updateYieldingBankConfigBuilder.ts +0 -32
- package/src/client/builders/utils.ts +0 -26
- package/src/client/client.ts +0 -264
- package/src/client/externalLiquidityResolver.ts +0 -54
- package/src/client/index.ts +0 -20
- package/src/client/lendingPlatformClients.ts +0 -50
- package/src/client/pda.ts +0 -102
- package/src/client/plans/collectInterest.ts +0 -207
- package/src/client/plans/decreaseCarryPosition.ts +0 -226
- package/src/client/routes/collectInterest.ts +0 -56
- package/src/client/transaction.ts +0 -106
- package/src/client/types/builders.ts +0 -19
- package/src/client/types/enums.ts +0 -47
- package/src/client/types/general.ts +0 -117
- package/src/client/types/index.ts +0 -6
- package/src/client/types/ix.ts +0 -452
- package/src/client/types/planTypes/collectInterest.ts +0 -97
- package/src/client/types/planTypes/common.ts +0 -31
- package/src/client/types/planTypes/decreaseCarryPosition.ts +0 -134
- package/src/client/types/planTypes/index.ts +0 -3
- package/src/client/types/tx.ts +0 -409
- package/src/constants/configs/allocations.ts +0 -30
- package/src/constants/configs/carryTradePresets.ts +0 -164
- package/src/constants/configs/index.ts +0 -2
- package/src/constants/general.ts +0 -141
- package/src/constants/index.ts +0 -3
- package/src/constants/lycTokenMetadata.ts +0 -52
- package/src/decoders/decodeTransaction.ts +0 -319
- package/src/decoders/discriminators.ts +0 -10
- package/src/decoders/idlAccounts.ts +0 -75
- package/src/decoders/index.ts +0 -15
- package/src/decoders/innerCpis.ts +0 -262
- package/src/decoders/lycInstructionNames.ts +0 -73
- package/src/decoders/programIds.ts +0 -12
- package/src/decoders/solana.ts +0 -25
- package/src/decoders/transactionPayload.ts +0 -41
- package/src/decoders/types.ts +0 -60
- package/src/errors.ts +0 -195
- package/src/idl/long_yield_carry.ts +0 -14648
- package/src/index.ts +0 -10
- package/src/metrics/index.ts +0 -1
- package/src/metrics/protocolMetrics.ts +0 -976
- package/src/models/index.ts +0 -9
- package/src/models/lycToken.ts +0 -380
- package/src/models/yieldingBank.ts +0 -127
- package/src/services/allocation/allocationService.ts +0 -823
- package/src/services/allocation/index.ts +0 -2
- package/src/services/allocation/types.ts +0 -27
- package/src/services/carry/carryAllocationConfig.ts +0 -266
- package/src/services/carry/index.ts +0 -2
- package/src/services/carry/lycLendingPositionManager.ts +0 -167
- package/src/services/index.ts +0 -5
- package/src/services/lendingPosition/index.ts +0 -5
- package/src/services/lendingPosition/lendingPositionService.ts +0 -328
- package/src/services/rebalance/index.ts +0 -2
- package/src/services/rebalance/token/index.ts +0 -1
- package/src/services/rebalance/token/tokenRebalanceService.ts +0 -142
- package/src/services/rebalance/yieldingBank/index.ts +0 -3
- package/src/services/rebalance/yieldingBank/planner.ts +0 -215
- package/src/services/rebalance/yieldingBank/strategy.ts +0 -41
- package/src/services/rebalance/yieldingBank/types.ts +0 -41
- package/src/services/redemption/index.ts +0 -9
- package/src/services/redemption/redemptionService.ts +0 -758
- package/src/types/enriched.ts +0 -187
- package/src/types/index.ts +0 -1
- package/src/utils/cache.ts +0 -12
- package/src/utils/data.ts +0 -65
- package/src/utils/enrichment.ts +0 -330
- package/src/utils/feeDripMetrics.ts +0 -146
- package/src/utils/general.ts +0 -54
- package/src/utils/index.ts +0 -13
- package/src/utils/ix.ts +0 -227
- package/src/utils/lendingPosition.ts +0 -221
- package/src/utils/lookupTables.ts +0 -309
- package/src/utils/lycData.ts +0 -321
- package/src/utils/timelock.ts +0 -63
- package/src/utils/tokenFeeMath.ts +0 -25
- package/src/utils/transactions.ts +0 -109
- package/src/utils/yieldingBank.ts +0 -38
- package/tsconfig.json +0 -11
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/client/account.ts","../src/models/lycToken.ts","../../../shared/common/src/utils/accounts/roles.ts","../../../shared/common/src/utils/accounts/meta.ts","../../../shared/common/src/utils/accounts/rpc.ts","../../../shared/common/src/utils/accounts/pda.ts","../../../shared/common/src/utils/compat.ts","../../../shared/common/src/utils/accounts/splBalances.ts","../../../shared/common/src/services/baseAccountClient.ts","../../../shared/common/src/services/dataCache.ts","../../../shared/common/src/utils/cpi/args.ts","../../../shared/common/src/utils/cpi/refs.ts","../../../shared/common/src/utils/instruction.ts","../../../shared/common/src/utils/solana.ts","../../../shared/common/src/utils/general.ts","../../../shared/common/src/services/mints/registry.ts","../../../shared/common/src/services/mints/defaults.ts","../../../shared/common/src/utils/numbers.ts","../../../shared/common/src/constants/general.ts","../../../shared/common/src/utils/rpc.ts","../../../shared/common/src/utils/retry.ts","../../../shared/common/src/utils/jsonRpcFetch.ts","../../../shared/common/src/utils/anchor.ts","../../../shared/common/src/utils/transaction.ts","../../../shared/common/src/services/lutManager.ts","../../../shared/common/src/constants/accountMetas.ts","../../../shared/common/src/constants/generated/cpi.ts","../../../shared/common/src/utils/jito.ts","../../../shared/common/src/utils/priorityFee.ts","../../../shared/common/src/utils/transactionSplitter.ts","../../../shared/common/src/utils/txAccountCoverage.ts","../../../shared/common/src/utils/token.ts","../../../shared/common/src/types/enums.ts","../../../shared/common/src/utils/metadata.ts","../../../shared/common/src/services/baseIxBuilderService.ts","../src/utils/general.ts","../src/utils/tokenFeeMath.ts","../src/models/yieldingBank.ts","../src/constants/general.ts","../src/utils/ix.ts","../src/client/pda.ts","../src/client/builders/base.ts","../src/utils/lookupTables.ts","../../../shared/oracle-service/src/oracle.ts","../../../shared/oracle-service/src/constants/pyth.ts","../../../shared/oracle-service/src/constants/switchboard.ts","../../../shared/oracle-service/src/feeds/jupiter.ts","../../../shared/oracle-service/src/feeds/priceBase.ts","../../../shared/oracle-service/src/constants/splStake.ts","../../../shared/oracle-service/src/feeds/pyth.ts","../../../shared/perena-helpers/src/constants.ts","../../../shared/perena-helpers/src/client.ts","../../../shared/perena-helpers/src/cpi/mint.ts","../../../shared/perena-helpers/src/cpi/burn.ts","../../../shared/perena-helpers/src/cpi/requestUnstake.ts","../../../shared/oracle-service/src/feeds/splStake.ts","../../../shared/oracle-service/src/utils/general.ts","../../../shared/oracle-service/src/feeds/switchboard.ts","../../../shared/oracle-service/src/feeds/custom.ts","../src/constants/lycTokenMetadata.ts","../src/client/builders/mintTokenBuilder.ts","../src/client/builders/refreshTokenStateBuilder.ts","../src/client/builders/refreshYieldingBankBuilder.ts","../src/client/builders/refreshTokensBuilder.ts","../src/client/builders/utils.ts","../src/client/builders/burnTokenBuilder.ts","../src/utils/cache.ts","../src/idl/long_yield_carry.ts"],"sourcesContent":["/**\n * Browser-safe entry point (`@kestrelfi/lyc-sdk/core`).\n *\n * Exposes the read + mint/burn surface without the operator graph: no\n * `LongYieldCarryClient` (its constructor eagerly builds Kamino and\n * swap-aggregator clients), no lending-platform imports, no Jupiter. This is\n * what frontends should import — the Kamino SDKs are optional peer\n * dependencies that only the full entry (`@kestrelfi/lyc-sdk`) needs.\n *\n * Consumers assemble a minimal builder context themselves:\n *\n * const program = new Program<LongYieldCarry>({ ...IDL, address: PROGRAM_ID[env] }, provider);\n * const pda = new PdaClient(address(program.programId.toBase58()));\n * const account = new AccountClient(program, pda, rpc);\n * const context = { rpc, environment: env, program, account, pda } as LongYieldCarryBuilderContext;\n * const plan = await new MintTokenBuilder(context).getTx({ signer, token, params });\n * await signSendAndConfirmTransaction(rpc, walletSigner, plan);\n *\n * Note: when a token's accounting is stale (> TOKEN_STALENESS_THRESHOLD_SECS),\n * the mint/burn builders prepend refresh instructions that DO require the\n * lending-platform clients — check `accounting.lastRefreshedTs` first and\n * surface a retry message instead.\n */\n\nexport { AccountClient } from \"./client/account\";\nexport { PdaClient } from \"./client/pda\";\nexport { LongYieldCarryBuilderBase } from \"./client/builders/base\";\nexport { MintTokenBuilder } from \"./client/builders/mintTokenBuilder\";\nexport { BurnTokenBuilder } from \"./client/builders/burnTokenBuilder\";\nexport type {\n BurnTokenIxArgs,\n BurnTokenTxArgs,\n MintTokenIxArgs,\n MintTokenTxArgs,\n} from \"./client/builders/args\";\nexport type { LongYieldCarryBuilderContext } from \"./client/types/builders\";\nexport type { LongYieldCarryTransactionPlan } from \"./client/types\";\nexport type { RedemptionEpochSnapshot, UserHolding } from \"./client/types/general\";\nexport type { BurnTokenTxParams, MintTokenTxParams } from \"./client/types/tx\";\nexport { LYCToken } from \"./models/lycToken\";\nexport type { TokenAccountData } from \"./models/lycToken\";\nexport * from \"./constants/general\";\nexport { LYC_TOKEN_METADATA } from \"./constants/lycTokenMetadata\";\nexport type { LycTokenMetadataEntry } from \"./constants/lycTokenMetadata\";\nexport { IDL } from \"./idl/long_yield_carry\";\nexport type { LongYieldCarry } from \"./idl/long_yield_carry\";\n\n// Re-export the exact Anchor build the SDK is compiled against so consumers\n// construct the Program/provider with matching IDL + coder semantics.\nexport { AnchorProvider, BN, Program, web3 } from \"@anchor-lang/core\";\n\n// Transaction pipeline (build → simulate → CU limit → sign → send → confirm)\n// and the shared types consumers need to drive it.\nexport {\n signSendAndConfirmTransaction,\n type Environment,\n type SendTransactionOptions,\n type TransactionPlan,\n} from \"common\";\n","import { type Address, address, type Rpc, type SolanaRpcApi } from \"@solana/kit\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { Program } from \"@anchor-lang/core\";\nimport { LongYieldCarry } from \"../idl/long_yield_carry\";\nimport { LYCToken, type TokenAccountData } from \"../models/lycToken\";\nimport { LYCYieldingBank, type YieldingBankAccountData } from \"../models/yieldingBank\";\nimport {\n BaseAccountClient,\n CustomAccountMeta,\n ExternalLiquidityType,\n ExternalLiquidityTypeToEnum,\n fetchSplTokenAccountAmounts,\n fromWeb3Pk,\n getAtaAddress,\n LendingPlatform,\n lendingPlatformToEnum,\n resolveTokenProgram,\n toBigInt,\n toCustomAccountMeta,\n toUiAmount,\n toWeb3Pk,\n} from \"common\";\nimport type { PdaClient } from \"./pda\";\nimport type {\n RedemptionEpochSnapshot,\n TokenLpPositionAccountOverrides,\n UserHolding,\n YieldingBankAllocationConfig,\n YieldingBankExternalLiquiditySource,\n} from \"./types\";\nimport { buildCarryTradeAccountMetas, buildRebalanceTokenInitialAccounts } from \"../utils/ix\";\n\n/** DataCache category for LYC `Token` accounts (used when clearing cache after writes). */\nexport const LYC_TOKEN_CACHE_CATEGORY = \"token\";\nexport const YIELDING_BANK_CACHE_CATEGORY = \"yieldingBank\";\nexport const REDEMPTION_EPOCH_CACHE_CATEGORY = \"redemptionEpoch\";\nexport const IGNORED_LYC_TOKEN_ADDRESSES = new Set<string>([\n \"GphwC2jwG3mcM8FYFFm5j8A4jNw3i7Hhic4poLbnoKpu\", // jupSOL - need proper oracle implementation to fix this (TODO)\n]);\n\n/**\n * Account fetchers for the long_yield_carry program.\n *\n * Extends {@link BaseAccountClient} for shared DataCache + `splAtaExists`, then adds LYC-specific\n * deserialization and helpers (Token, YieldingBank, carry-trade metas).\n */\nexport class AccountClient extends BaseAccountClient {\n constructor(\n private readonly program: Program<LongYieldCarry>,\n readonly pda: PdaClient,\n rpc: Rpc<SolanaRpcApi>\n ) {\n super(rpc, {\n categoryTtlMs: {\n [LYC_TOKEN_CACHE_CATEGORY]: 60_000 * 5,\n [YIELDING_BANK_CACHE_CATEGORY]: 60_000 * 10,\n [REDEMPTION_EPOCH_CACHE_CATEGORY]: 30_000,\n },\n });\n }\n\n /** Fetch and deserialize a Token account by its PDA address. */\n async fetchToken(token: Address, opts?: { fresh?: boolean }): Promise<LYCToken> {\n if (opts?.fresh) {\n this.dataCache.clearCacheEntry(LYC_TOKEN_CACHE_CATEGORY, token);\n }\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.token.fetch(toWeb3Pk(token)),\n LYC_TOKEN_CACHE_CATEGORY,\n token\n );\n return new LYCToken(token, data);\n }\n\n /** Fetch and deserialize multiple Token accounts by their PDA addresses. */\n async fetchTokens(tokens: Address[]): Promise<LYCToken[]> {\n const { data } = await this.dataCache.getDataBatch(\n () => this.program.account.token.fetchMultiple(tokens.map(toWeb3Pk)),\n LYC_TOKEN_CACHE_CATEGORY,\n tokens\n );\n return data.map((x, i) => new LYCToken(tokens[i], x));\n }\n\n /**\n * Fetch all Token accounts owned by the program.\n *\n * Pass `{ fresh: true }` to clear the cached `\"all\"` entry before reading,\n * forcing a fresh `getProgramAccounts` call. The returned data is\n * re-cached so subsequent callers benefit from the same refresh.\n */\n async fetchAllTokens(opts?: { fresh?: boolean }): Promise<LYCToken[]> {\n if (opts?.fresh) {\n this.dataCache.clearCacheEntry(LYC_TOKEN_CACHE_CATEGORY, \"all\");\n }\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.token.all(),\n LYC_TOKEN_CACHE_CATEGORY,\n \"all\"\n );\n return data\n .map((acc) => new LYCToken(address(acc.publicKey.toBase58()), acc.account))\n .filter(\n (token) =>\n !IGNORED_LYC_TOKEN_ADDRESSES.has(token.address) &&\n !IGNORED_LYC_TOKEN_ADDRESSES.has(token.mint)\n );\n }\n\n /** Fetch and deserialize a YieldingBank account by its PDA address. */\n async fetchYieldingBank(bank: Address): Promise<LYCYieldingBank> {\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.yieldingBank.fetch(toWeb3Pk(bank)),\n YIELDING_BANK_CACHE_CATEGORY,\n bank\n );\n return new LYCYieldingBank(bank, data);\n }\n\n /** Fetch and deserialize multiple YieldingBank accounts by their PDA addresses. */\n async fetchYieldingBanks(banks: Address[]): Promise<LYCYieldingBank[]> {\n const { data } = await this.dataCache.getDataBatch(\n () => this.program.account.yieldingBank.fetchMultiple(banks.map(toWeb3Pk)),\n YIELDING_BANK_CACHE_CATEGORY,\n banks\n );\n return data.map((x, i) => new LYCYieldingBank(banks[i], x));\n }\n\n /** Fetch all YieldingBank accounts owned by the program. */\n async fetchAllYieldingBanks(): Promise<LYCYieldingBank[]> {\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.yieldingBank.all(),\n YIELDING_BANK_CACHE_CATEGORY,\n \"all\"\n );\n return data.map((acc) => new LYCYieldingBank(address(acc.publicKey.toBase58()), acc.account));\n }\n\n /** Fetch and deserialize a RedemptionEpoch account by its PDA address. */\n async fetchRedemptionEpoch(\n epochPda: Address,\n opts?: { fresh?: boolean }\n ): Promise<RedemptionEpochSnapshot> {\n if (opts?.fresh) {\n this.dataCache.clearCacheEntry(REDEMPTION_EPOCH_CACHE_CATEGORY, epochPda);\n }\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.redemptionEpoch.fetch(toWeb3Pk(epochPda)),\n REDEMPTION_EPOCH_CACHE_CATEGORY,\n epochPda\n );\n return this.toRedemptionEpochSnapshot(epochPda, data);\n }\n\n /** Fetch all RedemptionEpoch accounts owned by the program. */\n async fetchAllRedemptionEpochs(opts?: { fresh?: boolean }): Promise<RedemptionEpochSnapshot[]> {\n if (opts?.fresh) {\n this.dataCache.clearCacheEntry(REDEMPTION_EPOCH_CACHE_CATEGORY, \"all\");\n }\n const { data } = await this.dataCache.getDataOrThrow(\n () => this.program.account.redemptionEpoch.all(),\n REDEMPTION_EPOCH_CACHE_CATEGORY,\n \"all\"\n );\n return data\n .filter((acc) => acc?.publicKey && acc?.account)\n .map((acc) => this.toRedemptionEpochSnapshot(address(acc.publicKey.toBase58()), acc.account));\n }\n\n /**\n * Fetch all LYC yToken holdings for a wallet.\n *\n * Reads the user's ATA per LYC token directly via `getMultipleAccounts` —\n * cost scales with the LYC token count (typically <10), not the wallet's\n * total token-account count, which can be in the hundreds for active users.\n *\n * USD valuation: only when `opts.priceMap` supplies a positive USD price for\n * the collateral mint and `token.price` (NAV) is positive:\n * `valueUsd = uiBalance × token.price × priceMap[collateralMint]`.\n * If the caller does not supply a usable collateral price, `valueUsd` is\n * omitted — we do not infer USD from on-chain `tvlUsd` / `totalSupply`, since\n * those can lag risk-asset markets by tens of minutes.\n *\n * Tokens with no user ATA or a zero balance are filtered out unless\n * `opts.includeEmpty` is set.\n *\n * Pass `opts.tokens` when the caller already has a list of tokens (e.g. a\n * backend service with its own shorter-lived tokens cache) to skip the\n * internal `fetchAllTokens` call and its 5-minute SDK cache.\n */\n async fetchUserHoldings(\n owner: Address,\n opts?: {\n includeEmpty?: boolean;\n tokens?: LYCToken[];\n priceMap?: Partial<Record<Address, number>>;\n }\n ): Promise<UserHolding[]> {\n const tokens = opts?.tokens ?? (await this.fetchAllTokens());\n if (tokens.length === 0) return [];\n\n // Derive the user's ATA per LYC token mint up front so we can fetch them\n // all in a single round trip rather than enumerating the wallet's full\n // token-account set.\n const ataByMint = new Map<Address, Address>();\n const ataAddresses: Address[] = [];\n for (const token of tokens) {\n const tokenProgram = resolveTokenProgram(token.data.config.tokenProgram);\n const ata = await getAtaAddress(token.mint, owner, tokenProgram);\n ataByMint.set(token.mint, ata);\n ataAddresses.push(ata);\n }\n\n const balanceByAta = await fetchSplTokenAccountAmounts(this.rpc, ataAddresses);\n\n const holdings: UserHolding[] = [];\n for (const token of tokens) {\n const tokenAccount = ataByMint.get(token.mint)!;\n const balance = balanceByAta.get(tokenAccount) ?? BigInt(0);\n\n if (balance === BigInt(0) && !opts?.includeEmpty) continue;\n\n const uiBalance = toUiAmount(balance, token.decimals);\n\n const collateralPrice = opts?.priceMap?.[token.collateralMint];\n let valueUsd: number | undefined;\n if (collateralPrice !== undefined && collateralPrice > 0 && token.price > 0) {\n valueUsd = uiBalance * token.price * collateralPrice;\n }\n\n holdings.push({\n token,\n tokenAccount,\n balance,\n uiBalance,\n valueUsd,\n });\n }\n return holdings;\n }\n\n /** Fetch all Token and YieldingBank accounts in parallel. */\n async fetchAllTokensAndYieldingBanks(): Promise<{\n tokens: LYCToken[];\n yieldingBanks: LYCYieldingBank[];\n }> {\n const [tokens, yieldingBanks] = await Promise.all([\n this.fetchAllTokens(),\n this.fetchAllYieldingBanks(),\n ]);\n return { tokens, yieldingBanks };\n }\n\n /**\n * Build the ordered remaining-accounts list required by refresh_yielding_bank\n * (and embedded within rebalance_yielding_bank):\n *\n * 1. base_asset: [token_account, oracle, external_liquidity...] (if active)\n * 2. Per active asset holding (in slot order): [token_account, oracle, external_liquidity...]\n * The token_account is the mint's ATA owned by the bank PDA; the program\n * reads its raw balance to sync asset.amount on every refresh.\n * 3. One user account per active external yielding position (in slot order)\n *\n * If `newAllocation` is provided, its [token_account, oracle, external_liquidity...]\n * tuple is injected at the first inactive slot, matching where `apply_allocation`\n * will register it.\n */\n async getYieldingBankRefreshAccounts(\n bank: Address,\n newAllocation?: YieldingBankAllocationConfig,\n externalLiquiditySources: YieldingBankExternalLiquiditySource[] = []\n ): Promise<CustomAccountMeta[]> {\n const bankData = await this.fetchYieldingBank(bank);\n\n const pushAssetAccounts = async (\n mint: Address,\n tokenProgramAddr: Address,\n externalLiquidityType: YieldingBankAccountData[\"baseAsset\"][\"externalLiquidity\"],\n oracle: Address,\n accounts: CustomAccountMeta[]\n ) => {\n const ata = await getAtaAddress(mint, bank, tokenProgramAddr);\n accounts.push(\n toCustomAccountMeta(ata, false, { owner: bank, tokenProgram: tokenProgramAddr, mint })\n );\n accounts.push(toCustomAccountMeta(oracle));\n if (ExternalLiquidityTypeToEnum(externalLiquidityType) !== ExternalLiquidityType.None) {\n const sources = externalLiquiditySources\n .filter((source) => source.mint === mint)\n .map((source) => source.account);\n accounts.push(...sources.map((source) => toCustomAccountMeta(source)));\n }\n };\n\n const assetAccounts: CustomAccountMeta[] = [];\n\n // base_asset first\n const baseAsset = bankData.baseAsset;\n if (!baseAsset.mint.equals(PublicKey.default)) {\n await pushAssetAccounts(\n fromWeb3Pk(baseAsset.mint),\n resolveTokenProgram(baseAsset.tokenProgram),\n baseAsset.externalLiquidity,\n fromWeb3Pk(baseAsset.oracle),\n assetAccounts\n );\n }\n\n // Per active asset holding: [token_account, oracle].\n // The first inactive slot gets the newAllocation pair (if provided).\n let newAssetInserted = false;\n for (const asset of bankData.assets) {\n if (!asset.mint.equals(PublicKey.default)) {\n await pushAssetAccounts(\n fromWeb3Pk(asset.mint),\n resolveTokenProgram(asset.tokenProgram),\n asset.externalLiquidity,\n fromWeb3Pk(asset.oracle),\n assetAccounts\n );\n } else if (newAllocation?.assetHolding && !newAssetInserted) {\n const { mint, oracle, externalLiquidityType } = newAllocation.assetHolding;\n const mintInfo = await this.rpc.getAccountInfo(mint, { encoding: \"base64\" }).send();\n const mintOwner = mintInfo.value!.owner;\n await pushAssetAccounts(mint, mintOwner, externalLiquidityType, oracle, assetAccounts);\n newAssetInserted = true;\n }\n }\n\n // External position accounts — active slots only (lendingPlatform != None).\n // Per position: [protocol_user_acc, collateral_reserve].\n // The new allocation's accounts are inserted at the first inactive slot.\n const extAccounts: CustomAccountMeta[] = [];\n let newExtInserted = false;\n for (const pos of bankData.externalYieldingPositions) {\n if (!(\"none\" in pos.lendingPlatform)) {\n extAccounts.push(toCustomAccountMeta(fromWeb3Pk(pos.protocolUserAcc)));\n extAccounts.push(toCustomAccountMeta(fromWeb3Pk(pos.collateralReserve)));\n } else if (newAllocation?.externalPosition && !newExtInserted) {\n extAccounts.push(toCustomAccountMeta(newAllocation.externalPosition.protocolUserAcc));\n extAccounts.push(toCustomAccountMeta(newAllocation.externalPosition.collateralReserve));\n newExtInserted = true;\n }\n }\n\n return [...assetAccounts, ...extAccounts];\n }\n\n /**\n * Build the carry-trade remaining accounts for increase/decrease carry\n * position instructions.\n *\n * Fetches the token's lending position at `lendingPositionIndex`, derives\n * the debt ATAs, and returns the ordered account metas that\n * `parse_carry_trade_accounts` expects on the Rust side.\n *\n * Returns the fixed carry-trade account prefix, including the instructions\n * sysvar in slot 8 so CPI refs are derived against the on-chain layout.\n *\n * @param lendingPositionUserAccount - Override for the protocol user account.\n * Defaults to the value stored in the on-chain lending position.\n */\n async getCarryTradeAccounts(\n token: Address,\n yieldingBank: Address,\n lendingPositionIndex: number,\n lendingPositionUserAccount?: Address\n ): Promise<CustomAccountMeta[]> {\n const tokenData = await this.fetchToken(token);\n const position = tokenData.data.lendingPositions[lendingPositionIndex];\n const debt = position.accounting.debt;\n const debtMint = fromWeb3Pk(debt.mint);\n const debtTokenProgram = resolveTokenProgram(debt.tokenProgram);\n const tokenLpDebtTa = await getAtaAddress(debtMint, token, debtTokenProgram);\n const yieldingBankTa = await getAtaAddress(debtMint, yieldingBank, debtTokenProgram);\n return buildCarryTradeAccountMetas(\n token,\n yieldingBank,\n tokenLpDebtTa,\n yieldingBankTa,\n lendingPositionUserAccount ?? fromWeb3Pk(position.protocolUserAcc),\n fromWeb3Pk(position.collateralReserve),\n fromWeb3Pk(position.accounting.debt.oracle),\n debtMint,\n debtTokenProgram\n );\n }\n\n /**\n * Derive the account set needed to refresh a single token lending position.\n *\n * This pulls the protocol user account, collateral reserve, and debt oracle\n * from the selected lending position so callers can pass the exact accounts\n * required by refresh-oriented instructions. Optional overrides let tests or\n * advanced callers substitute explicit addresses when needed.\n */\n getTokenLendingPositionRefreshAccounts(\n tokenData: TokenAccountData,\n lendingPositionIndex: number,\n overrides?: TokenLpPositionAccountOverrides\n ) {\n const position = tokenData.lendingPositions[lendingPositionIndex];\n if (!position) {\n throw new Error(`Invalid lending position index: ${lendingPositionIndex}`);\n }\n\n return {\n userAccount: overrides?.userAccount ?? fromWeb3Pk(position.protocolUserAcc),\n collateralReserve: overrides?.collateralReserve ?? fromWeb3Pk(position.collateralReserve),\n debtOracle: overrides?.debtOracle ?? fromWeb3Pk(position.accounting.debt.oracle),\n };\n }\n\n /**\n * Build the fixed initial-accounts prefix for `rebalance_token`.\n *\n * The Rust handler reads these positionally from the front of\n * `remaining_accounts` (see `RebalanceTokenAccounts::parse`). Returning the\n * prefix as `initialAccounts` to `createMultiCpiRefs` lets every CPI in the\n * flash-rebalance bundle deduplicate against these slots, shrinking the\n * transaction's account list compared to declaring them as named ix\n * accounts that would force separate copies in the message header.\n */\n async getRebalanceTokenInitialAccounts(\n token: Address,\n yieldingBank: Address,\n lpIndex: number,\n destinationDebtOracle: Address,\n overrides?: TokenLpPositionAccountOverrides\n ): Promise<CustomAccountMeta[]> {\n const tokenData = await this.fetchToken(token);\n const position = tokenData.data.lendingPositions[lpIndex];\n if (!position) {\n throw new Error(`Invalid lending position index: ${lpIndex}`);\n }\n const sourceDebtMint = fromWeb3Pk(position.accounting.debt.mint);\n const sourceDebtTokenProgram = resolveTokenProgram(position.accounting.debt.tokenProgram);\n const yieldingBankSourceDebtAta = await getAtaAddress(\n sourceDebtMint,\n yieldingBank,\n sourceDebtTokenProgram\n );\n const lp = this.getTokenLendingPositionRefreshAccounts(tokenData.data, lpIndex, overrides);\n return buildRebalanceTokenInitialAccounts({\n token,\n yieldingBank,\n sourceDebtMint,\n sourceDebtTokenProgram,\n yieldingBankSourceDebtAta,\n lpUserAccount: lp.userAccount,\n sourceDebtOracle: lp.debtOracle,\n destinationDebtOracle,\n });\n }\n\n /**\n * Build the initial account pool seed for refresh_token_state.\n *\n * These accounts are placed at the front of the deduplicated remaining_accounts\n * pool (positions 0..N-1), so the index-based TokenRefreshRefs computed by\n * the builder remain stable whether or not prereq CPIs introduce additional accounts.\n *\n * Order:\n * 1. Per active lending position (in slot order): protocol_user_acc, collateral_reserve, debt_oracle\n * 2. One YieldingBank PDA per active carry position (in slot order)\n */\n async getTokenRefreshAccounts(token: Address): Promise<CustomAccountMeta[]> {\n const tokenData = await this.fetchToken(token);\n const accounts: CustomAccountMeta[] = [];\n\n for (const position of tokenData.data.lendingPositions) {\n if (lendingPlatformToEnum(position.platform) === LendingPlatform.None) continue;\n accounts.push(toCustomAccountMeta(fromWeb3Pk(position.protocolUserAcc)));\n accounts.push(toCustomAccountMeta(fromWeb3Pk(position.collateralReserve)));\n accounts.push(toCustomAccountMeta(fromWeb3Pk(position.accounting.debt.oracle)));\n }\n\n for (const { data: carry } of tokenData.activeCarryPositions) {\n const baseMint = fromWeb3Pk(carry.yieldingBaseMint);\n const [bankPda] = await this.pda.deriveYieldingBankPda(baseMint, carry.yieldingBankId);\n accounts.push(toCustomAccountMeta(bankPda));\n }\n\n return accounts;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toRedemptionEpochSnapshot(pda: Address, data: any): RedemptionEpochSnapshot {\n return {\n pda,\n tokenPda: data.header.token.toBase58() as Address,\n epochId: BigInt(data.header.id.toString()),\n payer: data.header.payer.toBase58() as Address,\n status: data.header.status,\n requestCount: Number(data.sequencing.requestCount.toString()),\n processedRequestCount: Number(data.sequencing.processedRequestCount.toString()),\n grossCollateralClaim: toBigInt(data.accounting.grossCollateralClaim),\n realizedUnwindLoss: toBigInt(data.accounting.realizedUnwindLoss),\n fundedCollateral: toBigInt(data.accounting.fundedCollateral),\n };\n }\n}\n","import { address, type Address } from \"@solana/kit\";\nimport { BN, IdlAccounts } from \"@anchor-lang/core\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { LongYieldCarry } from \"../idl/long_yield_carry\";\nimport {\n applyBps,\n fromWeb3Pk,\n LendingPlatform,\n lendingPlatformToEnum,\n mints,\n toBigInt,\n toUiAmount,\n TVL_USD_DECIMAL_PLACES,\n} from \"common\";\nimport type { PdaClient } from \"../client/pda\";\nimport { podBoolToNumber } from \"../utils/general\";\nimport { collectableNetYieldUsd } from \"../utils/tokenFeeMath\";\nimport type { BurnAmounts, MintAmounts } from \"../client/types/general\";\n\nconst MAX_COLLECTABLE_SURPLUS_BPS = BigInt(1);\nconst BASIS_POINTS = BigInt(10_000);\n\n/** Decoded on-chain data for a Token account, derived from the IDL. */\nexport type TokenAccountData = IdlAccounts<LongYieldCarry>[\"token\"];\n\nexport type TokenLendingPositionData = TokenAccountData[\"lendingPositions\"][number];\n\nexport type TokenCarryPositionData = TokenAccountData[\"debtCarry\"][number];\n\n/** A carry position paired with its index in the `debtCarry` array. */\nexport interface IndexedCarryPosition {\n index: number;\n data: TokenCarryPositionData;\n}\n\n/** A lending position paired with its index in the `lendingPositions` array. */\nexport interface IndexedLendingPosition {\n index: number;\n data: TokenLendingPositionData;\n}\n\n/**\n * Wrapper around the raw Token account data from the program.\n *\n * Provides typed access to on-chain state and a home for\n * derived/computed helpers as the SDK grows.\n */\nexport class LYCToken {\n constructor(\n /** The Token PDA address this data was fetched from */\n readonly address: Address,\n /** Deserialized account data */\n readonly data: TokenAccountData\n ) {}\n\n get circuitBreaker(): number {\n return podBoolToNumber(this.data.config.circuitBreaker);\n }\n\n /** Whether the token is operational (circuit breaker is off). */\n get isActive(): boolean {\n return this.circuitBreaker === 0;\n }\n\n /**\n * Returns carry positions that have a non-default yielding base mint and\n * positive shares — i.e. positions with actual yield exposure. Includes the\n * original array index so callers can reference `debtCarry[index]` on-chain.\n */\n get activeCarryPositions(): IndexedCarryPosition[] {\n return this.data.debtCarry\n .map((carry, index) => ({ index, data: carry }))\n .filter(\n ({ data }) =>\n !data.yieldingBaseMint.equals(PublicKey.default) && toBigInt(data.shares) > BigInt(0)\n );\n }\n\n /**\n * Returns lending positions that have a non-None platform — i.e. positions\n * with an active lending protocol. Includes the original array index so\n * callers can reference `lendingPositions[index]` on-chain.\n */\n get activeLendingPositions(): IndexedLendingPosition[] {\n return this.data.lendingPositions\n .map((lp, index) => ({ index, data: lp }))\n .filter(({ data }) => lendingPlatformToEnum(data.platform) !== LendingPlatform.None);\n }\n\n /**\n * Subset of {@link activeLendingPositions} that currently has supplied\n * collateral on-chain. Filters out slots whose platform is set but whose\n * collateral has been fully withdrawn — those slots can still report\n * non-zero protocol-level state via a shared obligation, which makes them\n * unsafe targets for borrow/withdraw flows.\n */\n get usedLendingPositions(): IndexedLendingPosition[] {\n return this.activeLendingPositions.filter(\n ({ data }) => toBigInt(data.accounting.collateral) > BigInt(0)\n );\n }\n\n get config(): TokenAccountData[\"config\"] {\n return this.data.config;\n }\n\n get collateral(): TokenAccountData[\"collateral\"] {\n return this.data.collateral;\n }\n\n get fees(): TokenAccountData[\"fees\"] {\n return this.data.fees;\n }\n\n get accounting(): TokenAccountData[\"accounting\"] {\n return this.data.accounting;\n }\n\n get id(): number {\n return this.data.config.id;\n }\n\n get mint(): Address {\n return address(this.data.config.mint.toString());\n }\n\n get collateralMint(): Address {\n return address(this.data.collateral.mint.toString());\n }\n\n get label(): string {\n const symbol = mints.get(this.collateralMint)?.symbol;\n return (symbol ? symbol : this.address).toLowerCase();\n }\n\n get decimals(): number {\n return this.data.config.decimals;\n }\n\n /**\n * On-chain token price: **collateral per yToken** in UI units (same decimals as\n * the yToken), not USD. At genesis this is 1:1 with the collateral asset; it\n * moves with NAV. For USD notional use `tvlUsd` / `totalSupply`, or\n * `client.account.fetchUserHoldings` (pro-rata TVL).\n */\n get price(): number {\n return toUiAmount(this.data.accounting.price, this.decimals);\n }\n\n get totalSupply(): number {\n return toUiAmount(this.data.accounting.totalSupply, this.decimals);\n }\n\n /**\n * Total protocol TVL in USD (on-chain `accounting.tvlUsd` is 8-decimal\n * fixed-point USD, $1 = 10^8).\n */\n get tvlUsd(): number {\n return toUiAmount(this.data.accounting.tvlUsd, TVL_USD_DECIMAL_PLACES);\n }\n\n get depositLimitUi(): number {\n return toUiAmount(this.data.config.depositLimit, this.data.collateral.decimals);\n }\n\n /**\n * Sum of active `debtCarry[*].tvlUsd` (8-decimal normalized USD stored on-chain).\n * Mirrors the on-chain `Token::total_carry_tvl_usd` helper.\n */\n get totalCarryTvlUsd(): bigint {\n return this.activeCarryPositions.reduce(\n (sum, { data }) => sum + toBigInt(data.tvlUsd),\n BigInt(0)\n );\n }\n\n /**\n * Sum of active `lendingPositions[*].accounting.debt.tvlUsd` (8-decimal normalized USD).\n * Mirrors the on-chain `Token::total_lp_debt_usd` helper.\n */\n get totalLendingDebtTvlUsd(): bigint {\n return this.activeLendingPositions.reduce(\n (sum, { data }) => sum + toBigInt(data.accounting.debt.tvlUsd),\n BigInt(0)\n );\n }\n\n /**\n * Collectable net yield (8-dec USD): any carry surplus above debt. Zero when\n * carry TVL does not exceed debt TVL.\n */\n get collectableNetYieldUsd(): bigint {\n return collectableNetYieldUsd(this.totalCarryTvlUsd, this.totalLendingDebtTvlUsd);\n }\n\n /**\n * True when the token is active and carry TVL exceeds debt by at most 1 bp.\n */\n hasInterestToCollect(): boolean {\n const totalDebtUsd = this.totalLendingDebtTvlUsd;\n const surplusUsd = collectableNetYieldUsd(this.totalCarryTvlUsd, totalDebtUsd);\n\n if (!this.isActive || totalDebtUsd === BigInt(0) || surplusUsd === BigInt(0)) {\n return false;\n }\n\n // A carry surplus above 1 bp of debt cannot plausibly accrue between hourly\n // collection cycles at supported yields, so treat it as stablecoin pricing\n // drift instead of realizable interest. Cross-multiplication preserves\n // sub-bp precision without truncating an integer bps calculation.\n return surplusUsd * BASIS_POINTS <= totalDebtUsd * MAX_COLLECTABLE_SURPLUS_BPS;\n }\n\n /**\n * Returns every active lending position whose debt mint matches `debtMint`,\n * in on-chain slot order. A token may hold more than one position on the same\n * debt mint, so callers should loop over all of them. Empty when none match.\n */\n findLendingPositionsByDebtMint(debtMint: Address): IndexedLendingPosition[] {\n return this.activeLendingPositions.filter(\n ({ data }) => fromWeb3Pk(data.accounting.debt.mint) === debtMint\n );\n }\n\n /**\n * Mirror the on-chain `Token::compute_mint_amounts` formula.\n *\n * The holder price-fee (the residual after protocol/curator take their split)\n * is a gift to the pre-mint supply `S`. To stop the minter clawing back their\n * own gift, all minted tokens are sized at the post-gift price — i.e. scaled by\n * `S / (S + priceFee)`. The fee is not applied to the price on-chain at mint\n * time; it is buffered and released gradually by `refreshTokenState`, so this\n * quote returns the same base-unit amounts the program mints.\n *\n * When `totalSupply === 0`, the user is priced at the current price, protocol\n * and curator receive their configured base shares, and the residual is\n * buffered without post-gift scaling.\n */\n computeMintAmounts(depositAmount: BN | number): MintAmounts {\n const deposit = BigInt(depositAmount.toString());\n const feeBps = BigInt(this.data.fees.mintingFeeBps);\n const protocolPctBps = BigInt(this.data.fees.protocolMintBurnPctBps);\n const curatorPctBps = BigInt(this.data.fees.curatorMintBurnPctBps);\n const price = BigInt(this.data.accounting.price.toString());\n const scale = BigInt(Math.pow(10, this.data.config.decimals));\n const totalSupply = BigInt(this.data.accounting.totalSupply.toString());\n\n const tokensBeforeFees = (deposit * scale) / price;\n const totalFee = applyBps(tokensBeforeFees, feeBps);\n\n const baseProtocolFee = applyBps(totalFee, protocolPctBps);\n const baseCuratorFee = applyBps(totalFee, curatorPctBps);\n\n // Genesis: post-gift sizing has no pre-mint supply denominator. Keep the\n // configured split and let the on-chain accounting buffer the residual.\n if (totalSupply === 0n) {\n return {\n tokensToUser: tokensBeforeFees - totalFee,\n protocolFee: baseProtocolFee,\n curatorFee: baseCuratorFee,\n };\n }\n\n const priceFee = totalFee - baseProtocolFee - baseCuratorFee;\n\n // Post-gift sizing: scale every minted amount by S / (S + priceFee).\n const denom = totalSupply + priceFee;\n const tokensToUser = ((tokensBeforeFees - totalFee) * totalSupply) / denom;\n const protocolFee = (baseProtocolFee * totalSupply) / denom;\n const curatorFee = (baseCuratorFee * totalSupply) / denom;\n\n return { tokensToUser, protocolFee, curatorFee };\n }\n\n /**\n * Mirror the on-chain `Token::compute_burn_amounts` formula.\n *\n * Returns exact base-unit values for the three accounting effects of a burn:\n * - `collateralToUser`: collateral returned to the burner\n * - `protocolFee`: yTokens accrued as pending protocol fees\n * - `supplyReduction`: net decrease in total supply\n *\n * The holder price-fee (residual after protocol/curator take their split) is\n * not paid out as collateral; on-chain it is buffered and dripped into the\n * price for the remaining holders. The burner is leaving, so there is no\n * self-dealing to guard against and no post-gift scaling is applied. The same\n * configured split applies when all circulating supply is burned; the residual\n * remains buffered until it can be released gradually.\n */\n computeBurnAmounts(burnAmount: BN | number): BurnAmounts {\n const burn = BigInt(burnAmount.toString());\n const feeBps = BigInt(this.data.fees.burningFeeBps);\n const protocolPctBps = BigInt(this.data.fees.protocolMintBurnPctBps);\n const curatorPctBps = BigInt(this.data.fees.curatorMintBurnPctBps);\n const price = BigInt(this.data.accounting.price.toString());\n const scale = BigInt(Math.pow(10, this.data.config.decimals));\n\n const totalFee = applyBps(burn, feeBps);\n const protocolFee = applyBps(totalFee, protocolPctBps);\n const curatorFee = applyBps(totalFee, curatorPctBps);\n const tokensAfterFee = burn - totalFee;\n const collateralToUser = (tokensAfterFee * price) / scale;\n const supplyReduction = burn - protocolFee - curatorFee;\n\n return { collateralToUser, protocolFee, curatorFee, supplyReduction };\n }\n\n /**\n * Convenience wrapper around {@link computeBurnAmounts} that returns only\n * the collateral owed to the user, converted to a UI amount\n * (divided by 10^collateral.decimals).\n */\n computeBurnWithdrawUiAmount(burnAmount: BN | number): number {\n const { collateralToUser } = this.computeBurnAmounts(burnAmount);\n return toUiAmount(collateralToUser, this.data.collateral.decimals);\n }\n\n /**\n * Derives the YieldingBank PDA for the `debtCarry` entry at `debtCarryIndex`.\n *\n * @param debtCarryIndex - Index into `data.debtCarry`\n * @param pda - Program PDA client (`YIELDING_BANK` seeds match on-chain).\n */\n async deriveYieldingBankAddressForDebtCarryIndex(\n debtCarryIndex: number,\n pda: PdaClient\n ): Promise<Address> {\n const carry = this.data.debtCarry[debtCarryIndex];\n if (!carry) {\n throw new Error(\n `Invalid debtCarryIndex ${debtCarryIndex} (token has ${this.data.debtCarry.length} debt carry entries)`\n );\n }\n if (carry.yieldingBaseMint.equals(PublicKey.default)) {\n throw new Error(\n `debtCarry[${debtCarryIndex}] has no active yielding bank (zero yielding base mint)`\n );\n }\n const [bankPda] = await pda.deriveYieldingBankPda(\n fromWeb3Pk(carry.yieldingBaseMint),\n carry.yieldingBankId\n );\n return bankPda;\n }\n\n /**\n * Resolves the YieldingBank PDA for the token's first active `debtCarry`\n * entry. Used as a default when callers haven't picked a specific bank.\n */\n async resolveFirstYieldingBankAddress(pda: PdaClient): Promise<Address> {\n const firstActiveIdx = this.data.debtCarry.findIndex(\n (entry) => !entry.yieldingBaseMint.equals(PublicKey.default)\n );\n if (firstActiveIdx < 0) {\n throw new Error(\n \"Token has no active yielding banks — call `increase_carry_position` first or pick a bank explicitly\"\n );\n }\n return this.deriveYieldingBankAddressForDebtCarryIndex(firstActiveIdx, pda);\n }\n}\n","import { AccountRole, upgradeRoleToSigner, upgradeRoleToWritable } from \"@solana/kit\";\nimport { CustomAccountMeta } from \"../../types\";\n\nexport function isRoleWritable(role: AccountRole): boolean {\n return role === AccountRole.WRITABLE || role === AccountRole.WRITABLE_SIGNER;\n}\n\nexport function isRoleSigner(role: AccountRole): boolean {\n return role === AccountRole.READONLY_SIGNER || role === AccountRole.WRITABLE_SIGNER;\n}\n\nexport function getAccountRole(isWritable: boolean, isSigner: boolean): AccountRole {\n let role: AccountRole = AccountRole.READONLY;\n if (isWritable) role = upgradeRoleToWritable(role);\n if (isSigner) role = upgradeRoleToSigner(role);\n return role;\n}\n\n/**\n * Downgrade a role from signer to non-signer, preserving writability.\n *\n * This is useful when preparing accounts for CPI patterns where a PDA\n * signs via `invoke_signed` on-chain, not externally.\n *\n * @param role - The account role to downgrade\n * @returns The role without signer status\n */\nexport function downgradeRoleFromSigner(role: AccountRole): AccountRole {\n if (role === AccountRole.READONLY_SIGNER) return AccountRole.READONLY;\n if (role === AccountRole.WRITABLE_SIGNER) return AccountRole.WRITABLE;\n return role;\n}\n\n/**\n * Strip signer status from all accounts in a list.\n *\n * Use this when passing accounts as remainingAccounts for CPI patterns\n * where a PDA signs via `invoke_signed`. The on-chain program handles\n * PDA signing, so remainingAccounts should not have signer flags.\n *\n * @param accounts - Array of accounts to strip signer status from\n * @returns New array with signer status removed\n */\nexport function stripSignerFromAccounts(accounts: CustomAccountMeta[]): CustomAccountMeta[] {\n return accounts.map((acc) => ({\n ...acc,\n role: downgradeRoleFromSigner(acc.role),\n }));\n}\n","import { Address } from \"@solana/kit\";\nimport { CustomAccountMeta } from \"../../types\";\nimport { getAccountRole } from \"./roles\";\nimport { AccountMeta } from \"@solana/web3.js\";\nimport { AssociatedTokenSeeds } from \"@solana-program/token\";\n\n/**\n * Create a CustomAccountMeta from individual parameters.\n *\n * @param address - The account's public key\n * @param isWritable - Whether the account is writable (default: false)\n * @param requiredAtaDetails - Optional ATA details if this account needs to be created\n * @param isSigner - Whether the account is a signer (default: false)\n * @returns A CustomAccountMeta object\n */\nexport function toCustomAccountMeta(\n address: Address,\n isWritable?: boolean,\n requiredAtaDetails?: AssociatedTokenSeeds,\n isSigner?: boolean\n): CustomAccountMeta {\n const role = getAccountRole(isWritable ?? false, isSigner ?? false);\n return { address, role, isRequiredAta: requiredAtaDetails };\n}\n\n/**\n * Convert a web3.js AccountMeta to a CustomAccountMeta.\n *\n * @param web3AccountMeta - The web3.js AccountMeta\n * @returns A CustomAccountMeta object\n */\nexport function toCustomAccountMetaFromWeb3AccountMeta(\n web3AccountMeta: AccountMeta\n): CustomAccountMeta {\n return toCustomAccountMeta(\n web3AccountMeta.pubkey.toBase58() as Address,\n web3AccountMeta.isWritable,\n undefined,\n web3AccountMeta.isSigner\n );\n}\n","import { Address, Rpc, SolanaRpcApi } from \"@solana/kit\";\n\nexport interface AllAccountsExistResult {\n existingAddresses: Address[];\n missingAddresses: Address[];\n existsByAddress: Map<Address, boolean>;\n}\n\nexport async function allAccountsExist(\n rpc: Rpc<SolanaRpcApi>,\n addresses: Address[]\n): Promise<AllAccountsExistResult> {\n if (!addresses.length) {\n return {\n existingAddresses: [],\n missingAddresses: [],\n existsByAddress: new Map(),\n };\n }\n\n const uniqueAddresses = [...new Set(addresses)];\n const response = await (\n rpc as Rpc<SolanaRpcApi> & {\n getMultipleAccounts: (\n addrs: Address[],\n config: { encoding: \"base64\" }\n ) => { send(): Promise<{ value: Array<unknown | null> }> };\n }\n )\n .getMultipleAccounts(uniqueAddresses, { encoding: \"base64\" })\n .send();\n\n const existsByAddress = new Map<Address, boolean>();\n for (let i = 0; i < uniqueAddresses.length; i += 1) {\n existsByAddress.set(uniqueAddresses[i], response.value[i] !== null);\n }\n\n return {\n existingAddresses: uniqueAddresses.filter((address) => existsByAddress.get(address)),\n missingAddresses: uniqueAddresses.filter((address) => !existsByAddress.get(address)),\n existsByAddress,\n };\n}\n\nexport async function accountExists(rpc: Rpc<SolanaRpcApi>, address: Address): Promise<boolean> {\n const accountInfo = await rpc.getAccountInfo(address, { encoding: \"base64\" }).send();\n return accountInfo.value !== null;\n}\n","import { Address } from \"@solana/kit\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { fromWeb3Pk, toWeb3Pk } from \"../compat\";\n\n/**\n * SPL associated token account (ATA) for mint + owner + token program (same PDA as\n * `@solana-program/token`’s `findAssociatedTokenPda`).\n */\nfunction deriveAssociatedTokenAddress(\n mint: Address,\n owner: Address,\n tokenProgram: Address\n): Address {\n const [ata] = PublicKey.findProgramAddressSync(\n [toWeb3Pk(owner).toBuffer(), toWeb3Pk(tokenProgram).toBuffer(), toWeb3Pk(mint).toBuffer()],\n new PublicKey(ASSOCIATED_TOKEN_PROGRAM_ADDRESS)\n );\n return fromWeb3Pk(ata);\n}\n\nexport async function getAtaAddress(\n mint: Address,\n owner: Address,\n tokenProgram: Address = TOKEN_PROGRAM_ADDRESS\n): Promise<Address> {\n return deriveAssociatedTokenAddress(mint, owner, tokenProgram);\n}\n","/**\n * Kit <-> Web3.js compatibility helpers.\n *\n * These helpers bridge between Kit v2 types and web3.js v1 types,\n * which is needed when using Kit with Anchor (which still uses web3.js v1).\n */\n\nimport { AccountMeta as Web3AccountMeta, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { Address, AccountMeta, AccountRole, Instruction, address } from \"@solana/kit\";\nimport { CustomAccountMeta } from \"../types\";\n\n/**\n * Convert a Kit Address to a web3.js PublicKey.\n *\n * @param addr - Kit Address (base58 string branded type)\n * @returns web3.js PublicKey\n */\nexport function toWeb3Pk(addr: Address): PublicKey {\n return new PublicKey(addr);\n}\n\n/**\n * Convert a web3.js PublicKey to a Kit Address\n *\n * @param addr - web3.js PublicKey\n * @returns Kit Address\n */\nexport function fromWeb3Pk(addr: PublicKey): Address {\n return address(addr.toString());\n}\n\n/**\n * Convert a Kit AccountMeta to web3.js AccountMeta format.\n *\n * Kit uses an AccountRole enum, while web3.js uses isSigner/isWritable booleans.\n * This is useful for Anchor's remainingAccounts which expects web3.js format.\n *\n * @param account - Kit AccountMeta\n * @returns web3.js compatible AccountMeta\n */\nexport function toWeb3AccountMeta(account: AccountMeta | CustomAccountMeta): {\n pubkey: PublicKey;\n isSigner: boolean;\n isWritable: boolean;\n} {\n return {\n pubkey: new PublicKey(account.address),\n isSigner:\n account.role === AccountRole.READONLY_SIGNER || account.role === AccountRole.WRITABLE_SIGNER,\n isWritable:\n account.role === AccountRole.WRITABLE || account.role === AccountRole.WRITABLE_SIGNER,\n };\n}\n\n/**\n * Convert a web3.js TransactionInstruction to Kit Instruction.\n *\n * This allows using Anchor-generated instructions with Kit's transaction building.\n *\n * @param ix - web3.js TransactionInstruction (from Anchor's .instruction())\n * @returns Kit Instruction\n */\nexport function toKitInstruction(ix: TransactionInstruction): Instruction {\n return {\n programAddress: ix.programId.toBase58() as Address,\n data: new Uint8Array(ix.data),\n accounts: ix.keys.map((key: Web3AccountMeta) => ({\n address: key.pubkey.toBase58() as Address,\n role: key.isWritable\n ? key.isSigner\n ? AccountRole.WRITABLE_SIGNER\n : AccountRole.WRITABLE\n : key.isSigner\n ? AccountRole.READONLY_SIGNER\n : AccountRole.READONLY,\n })),\n };\n}\n","import { Address, Rpc, SolanaRpcApi } from \"@solana/kit\";\n\n/**\n * Byte offset of the `amount` field in an SPL token account's serialized layout:\n *\n * [0..32) mint\n * [32..64) owner\n * [64..72) amount: u64 little-endian\n *\n * Token-2022 preserves the same base layout at these offsets; account\n * extensions (if any) live after byte 165, so reading the base `amount` at 64\n * is correct for both token programs.\n */\nconst SPL_TOKEN_ACCOUNT_AMOUNT_OFFSET = 64;\n\n/** `getMultipleAccounts` is capped at this many keys per request. */\nconst GET_MULTIPLE_ACCOUNTS_MAX_KEYS = 100;\n\n/**\n * Fetch SPL token account `amount` values for a list of token accounts in one\n * (or a small number of) RPC calls.\n *\n * Keyed by token account address rather than mint so the caller can derive\n * whatever mapping they need. Closed or non-existent accounts are simply\n * absent from the returned map (callers should treat them as `0`).\n *\n * Works for both SPL Token and Token-2022 accounts — the base layout through\n * byte 72 is identical. Use this instead of `getTokenAccountsByOwner` when\n * the set of accounts to read is known in advance; it scales with the query\n * set size rather than with the wallet's total token-account count.\n */\nexport async function fetchSplTokenAccountAmounts(\n rpc: Rpc<SolanaRpcApi>,\n tokenAccounts: Address[]\n): Promise<Map<Address, bigint>> {\n if (tokenAccounts.length === 0) return new Map();\n\n const chunks: Address[][] = [];\n for (let i = 0; i < tokenAccounts.length; i += GET_MULTIPLE_ACCOUNTS_MAX_KEYS) {\n chunks.push(tokenAccounts.slice(i, i + GET_MULTIPLE_ACCOUNTS_MAX_KEYS));\n }\n\n const balances = new Map<Address, bigint>();\n await Promise.all(\n chunks.map(async (chunk) => {\n const response = await (\n rpc as Rpc<SolanaRpcApi> & {\n getMultipleAccounts: (\n addrs: Address[],\n config: { encoding: \"base64\" }\n ) => {\n send(): Promise<{\n value: Array<{ data: [string, \"base64\"] } | null>;\n }>;\n };\n }\n )\n .getMultipleAccounts(chunk, { encoding: \"base64\" })\n .send();\n\n for (let i = 0; i < chunk.length; i++) {\n const entry = response.value[i];\n if (!entry) continue;\n const buf = Buffer.from(entry.data[0], \"base64\");\n balances.set(chunk[i], buf.readBigUInt64LE(SPL_TOKEN_ACCOUNT_AMOUNT_OFFSET));\n }\n })\n );\n return balances;\n}\n","import type { Address, Rpc, SolanaRpcApi } from \"@solana/kit\";\nimport { fetchMaybeToken } from \"@solana-program/token\";\nimport { DataCache, type CacheTtlConfig } from \"./dataCache\";\n\n/**\n * DataCache category for SPL associated-token-account existence (e.g. `BaseAccountClient#splAtaExists`).\n * Must match the `splAta` branch of `TransactionCacheInvalidation` for post-success cache clears.\n */\nexport const SPL_ATA_CACHE_CATEGORY = \"splAta\" as const;\n\n/** Default TTL for {@link SPL_ATA_CACHE_CATEGORY} entries (SPL token account existence). */\nconst DEFAULT_SPL_ATA_TTL_MS = 60_000 * 10;\n\n/**\n * Program-agnostic account helpers: shared {@link DataCache} wiring and SPL ATA existence\n * checks for instruction builders (e.g. `getCreateAtaIxIfNeeded`). Extend this in per-program\n * SDKs for typed account fetchers and domain-specific cache categories.\n */\nexport class BaseAccountClient {\n readonly dataCache: DataCache;\n\n protected constructor(\n protected readonly rpc: Rpc<SolanaRpcApi>,\n options?: Pick<CacheTtlConfig, \"defaultTtlMs\" | \"categoryTtlMs\">\n ) {\n this.dataCache = new DataCache({\n defaultTtlMs: options?.defaultTtlMs,\n categoryTtlMs: {\n [SPL_ATA_CACHE_CATEGORY]: DEFAULT_SPL_ATA_TTL_MS,\n ...options?.categoryTtlMs,\n },\n });\n }\n\n /**\n * Whether an SPL token account exists at `ata`. Cached under {@link SPL_ATA_CACHE_CATEGORY};\n * clear via post-success `splAta` transaction cache invalidations after successful creates.\n */\n async splAtaExists(ata: Address): Promise<boolean> {\n const { data } = await this.dataCache.getData(\n async () => (await fetchMaybeToken(this.rpc, ata)).exists,\n SPL_ATA_CACHE_CATEGORY,\n ata\n );\n return data ?? false;\n }\n}\n","interface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nexport interface CacheTtlConfig {\n defaultTtlMs?: number;\n categoryTtlMs?: Record<string, number>;\n}\n\nexport class DataCache {\n protected cache: Map<string, Map<string, CacheEntry<any>>> = new Map();\n protected ttlConfig: CacheTtlConfig;\n\n constructor(ttlConfig?: CacheTtlConfig) {\n this.ttlConfig = {\n defaultTtlMs: ttlConfig?.defaultTtlMs ?? 60_000 * 5, // 5 minute default\n categoryTtlMs: ttlConfig?.categoryTtlMs ?? {},\n };\n }\n\n async getData<T>(\n fetchFn: () => Promise<T | null>,\n category: string,\n id: string,\n options?: { cacheNull?: boolean }\n ): Promise<{ data: T | null; fromCache: boolean }> {\n let data = this.tryFromCache<T>(category, id);\n let fromCache = true;\n if (!data) {\n data = await fetchFn();\n\n if (data !== null || options?.cacheNull !== false) {\n this.setCache(category, id, data);\n }\n fromCache = false;\n }\n return { data, fromCache };\n }\n\n async getDataOrThrow<T>(\n fetchFn: () => Promise<T | null>,\n category: string,\n id: string,\n options?: { cacheNull?: boolean }\n ): Promise<{ data: T; fromCache: boolean }> {\n const { data, fromCache } = await this.getData(fetchFn, category, id, options);\n if (!data) {\n throw new Error(`Failed to fetch ${category} data, ID: ${id}`);\n }\n return { data, fromCache };\n }\n\n async getDataBatch<T>(\n fetchFn: () => Promise<(T | null)[]>,\n category: string,\n ids: string[]\n ): Promise<{ data: T[]; fromCache: boolean }> {\n let data = ids.map((id) => this.tryFromCache<T>(category, id));\n let fromCache = true;\n\n if (data.some((item) => item === null)) {\n data = await fetchFn();\n if (!data) {\n throw new Error(`Failed to batch fetch ${category} data`);\n }\n for (let i = 0; i < ids.length; i++) {\n this.setCache(category, ids[i], data[i]);\n }\n fromCache = false;\n }\n\n return { data: data as T[], fromCache };\n }\n\n private getTtlForCategory(category: string): number {\n return this.ttlConfig.categoryTtlMs?.[category] ?? this.ttlConfig.defaultTtlMs!;\n }\n\n protected isStale(entry: CacheEntry<any>, category: string): boolean {\n const ttl = this.getTtlForCategory(category);\n const age = Date.now() - entry.timestamp;\n return age > ttl;\n }\n\n /** Returns null if not found or stale */\n protected tryFromCache<T>(category: string, id: string): T | null {\n const categoryCache = this.cache.get(category);\n if (!categoryCache) {\n return null;\n }\n\n const entry = categoryCache.get(id);\n if (!entry) {\n return null;\n }\n\n if (this.isStale(entry, category)) {\n categoryCache.delete(id);\n return null;\n }\n\n return entry.data as T;\n }\n\n protected getCacheAge(category: string, id: string): number | null {\n const categoryCache = this.cache.get(category);\n if (!categoryCache) {\n return null;\n }\n\n const entry = categoryCache.get(id);\n if (!entry) {\n return null;\n }\n\n return Date.now() - entry.timestamp;\n }\n\n setCache(category: string, id: string, data: any): void {\n let categoryCache = this.cache.get(category);\n if (!categoryCache) {\n categoryCache = new Map();\n this.cache.set(category, categoryCache);\n }\n\n categoryCache.set(id, {\n data,\n timestamp: Date.now(),\n });\n }\n\n refreshCategory(category: string): void {\n const categoryCache = this.cache.get(category);\n if (categoryCache) {\n categoryCache.clear();\n }\n }\n\n clearCacheEntry(category: string, id: string): boolean {\n const categoryCache = this.cache.get(category);\n if (!categoryCache) {\n return false;\n }\n return categoryCache.delete(id);\n }\n\n clearStaleEntries(category: string): number {\n const categoryCache = this.cache.get(category);\n if (!categoryCache) {\n return 0;\n }\n\n let cleared = 0;\n for (const [id, entry] of categoryCache.entries()) {\n if (this.isStale(entry, category)) {\n categoryCache.delete(id);\n cleared++;\n }\n }\n return cleared;\n }\n\n clearAllStaleEntries(): number {\n let totalCleared = 0;\n for (const category of this.cache.keys()) {\n totalCleared += this.clearStaleEntries(category);\n }\n return totalCleared;\n }\n\n clearAllCache(): void {\n this.cache.clear();\n }\n}\n","/**\n * CPI args buffer utilities.\n *\n * # Wire format (per CPI slot)\n *\n * ```text\n * [u16 LE length]\n * • 0xFFFF → skip (program must compute args)\n * • 0 → no instruction args (invoke with empty data)\n * • N > 0 → N bytes of client-provided data follow\n * ```\n *\n * Protocol-specific getter functions (e.g. `getPerenaMintArgs`) return raw\n * serialized bytes (no prefix). Wrap them with `serializeArgs()` to add\n * the u16 length prefix before packing into the CPI args buffer.\n */\n\n/** Sentinel u16 value meaning \"program must provide args.\" */\nexport const SKIP_SENTINEL = 0xffff;\n\n/**\n * Serialize CPI args with a u16 LE length prefix.\n *\n * - Called with data → `[u16_len, ...data]` (client provides args; len may be 0)\n * - Called without data → `[0xFF, 0xFF]` (skip — program provides args)\n *\n * @example\n * ```typescript\n * serializeArgs(getPerenaMintArgs({ ... })) // [16, 0, ...16 bytes]\n * serializeArgs(jupiterSwapData) // [N, 0, ...N bytes]\n * serializeArgs(Buffer.alloc(0)) // [0, 0] — no-args instruction\n * serializeArgs() // [0xFF, 0xFF] — skip\n * ```\n */\nexport function serializeArgs(data?: Buffer | Uint8Array): Buffer {\n if (data === undefined) {\n const buf = Buffer.alloc(2);\n buf.writeUInt16LE(SKIP_SENTINEL);\n return buf;\n }\n const len = data.length;\n const buf = Buffer.alloc(2 + len);\n buf.writeUInt16LE(len);\n if (len > 0) {\n Buffer.from(data).copy(buf, 2);\n }\n return buf;\n}\n\n/**\n * Fluent builder for packing CPI args into a single buffer.\n *\n * Each `.add()` call wraps the provided data with a u16 length prefix\n * via `serializeArgs`, then appends it.\n *\n * @example\n * ```typescript\n * const cpiArgs = new CpiArgsBuilder()\n * .add(getPerenaMintArgs({ amountYieldingDeposit: 1e6, minBankMintMinted: 9e5 }))\n * .add(jupiterSwapData)\n * .noArgs() // no-args instruction (len = 0)\n * .skip() // program provides args (0xFFFF)\n * .build();\n * ```\n */\nexport class CpiArgsBuilder {\n private parts: Buffer[] = [];\n\n /**\n * Add client-provided args for the next CPI slot.\n * Automatically wraps with a u16 LE length prefix.\n */\n add(data: Buffer | Uint8Array): this {\n this.parts.push(serializeArgs(data));\n return this;\n }\n\n /**\n * Mark the next CPI slot as a no-args instruction (length = 0).\n * The Rust side will invoke the CPI with empty instruction data.\n */\n noArgs(): this {\n this.parts.push(serializeArgs(Buffer.alloc(0)));\n return this;\n }\n\n /**\n * Mark the next CPI slot as program-provided (sentinel 0xFFFF).\n * The Rust handler must compute args and call `invoke_cpi` directly.\n */\n skip(): this {\n this.parts.push(serializeArgs());\n return this;\n }\n\n /** Build the final packed buffer. */\n build(): Buffer {\n return Buffer.concat(this.parts);\n }\n}\n","/**\n * CPI account mapping utilities for multi-CPI transactions.\n */\n\nimport { upgradeRoleToSigner, upgradeRoleToWritable, type Address } from \"@solana/kit\";\nimport { CpiData, CustomAccountMeta, InstructionRefs } from \"../../types\";\nimport { isRoleWritable, isRoleSigner, stripSignerFromAccounts } from \"../accounts/roles\";\nimport { CpiArgsBuilder } from \"./args\";\nimport { toCustomAccountMeta } from \"../accounts\";\n\n/**\n * Mapping for extracting accounts from `remainingAccounts` across multiple CPIs.\n *\n * @example\n * For 2 CPIs where CPI 0 needs 10 accounts and CPI 1 needs 8 accounts:\n * ```\n * indices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 5, 7, 10, 11, 12, 13, 14]\n * lengths: [10, 8]\n *\n * CPI 0 uses indices[0..10]\n * CPI 1 uses indices[10..18]\n * ```\n *\n * Matches Rust `CpiMapping` struct.\n */\nexport interface CpiMapping {\n /** All indices into the account pool, flattened across all CPIs */\n indices: Buffer;\n /** Number of accounts per CPI - used to slice indices */\n lengths: Buffer;\n}\n\n/**\n * Input for a single CPI in deduplication.\n *\n * Any object with `cpiType` and `accounts` can be used, including `CpiData`.\n *\n * @property cpiType - Index into CPI_REGISTRY\n * @property accounts - Accounts for this CPI (PROGRAM MUST BE FIRST!)\n */\nexport interface CpiInput {\n /** Index into CPI_REGISTRY (e.g., CpiTypes.PERENA_MINT) */\n cpiType: number;\n /** Accounts for this CPI - PROGRAM MUST BE FIRST ACCOUNT */\n accounts: CustomAccountMeta[];\n}\n\n/**\n * Options for deduplicating CPI accounts.\n */\nexport interface DeduplicateOptions {\n /**\n * Accounts to pre-populate the pool with before processing CPIs.\n *\n * These accounts are inserted at the beginning of the pool (positions 0..N-1)\n * so that CPI account indices correctly reference them. Any CPI account\n * whose address matches an initial account reuses that slot (deduplication).\n *\n * Use this to merge oracle accounts with CPI accounts in a single pass.\n */\n initialAccounts?: CustomAccountMeta[];\n /** Addresses to track - returns their indices in the pool */\n trackAddresses?: Address[];\n}\n\n/**\n * Result of creating CPI refs from multiple CPI account lists.\n */\nexport interface CreateCpiRefsResult {\n /** The deduplicated pool of unique accounts (pass as remainingAccounts) */\n accounts: CustomAccountMeta[];\n /** Anchor-serializable instruction refs (pass to Rust) */\n refs: InstructionRefs;\n lookupTables: Address[];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Build indices for a single account list against a pool.\n */\nfunction buildIndicesForCpi(\n accounts: CustomAccountMeta[],\n poolIndex: Map<Address, number>\n): number[] {\n return accounts.map((acc) => {\n const idx = poolIndex.get(acc.address);\n if (idx === undefined) {\n throw new Error(`Account ${acc.address} not found in pool`);\n }\n return idx;\n });\n}\n\n/**\n * Build deduplicated pool from multiple account lists.\n */\nfunction buildDeduplicatedPool(\n accountLists: CustomAccountMeta[][]\n): Map<Address, CustomAccountMeta> {\n const poolMap = new Map<Address, CustomAccountMeta>();\n\n for (const accounts of accountLists) {\n for (const acc of accounts) {\n const existing = poolMap.get(acc.address);\n if (!existing) {\n poolMap.set(acc.address, { ...acc });\n } else {\n // Upgrade role if needed (most permissive wins)\n if (isRoleWritable(acc.role) && !isRoleWritable(existing.role)) {\n existing.role = upgradeRoleToWritable(existing.role);\n }\n if (isRoleSigner(acc.role) && !isRoleSigner(existing.role)) {\n existing.role = upgradeRoleToSigner(existing.role);\n }\n }\n }\n }\n\n return poolMap;\n}\n\n/**\n * Build a pool that preserves the exact sequential order of `initialAccounts`\n * (no deduplication within them) and then appends CPI accounts deduplicated\n * against the pool's first-occurrence index.\n *\n * This is required for instructions like `refresh_yielding_bank` that read\n * remaining_accounts **positionally** — deduplicating the initial accounts\n * would shift indices and break the sequential read order.\n */\nfunction buildPoolWithOrderedInitial(\n initialAccounts: CustomAccountMeta[],\n accountLists: CustomAccountMeta[][]\n): { pool: CustomAccountMeta[]; poolIndex: Map<Address, number> } {\n // Preserve every initial account entry in order (duplicates allowed).\n const pool: CustomAccountMeta[] = initialAccounts.map((acc) => ({ ...acc }));\n\n // Index maps each address to its FIRST occurrence for CPI dedup lookups.\n const poolIndex = new Map<Address, number>();\n pool.forEach((acc, i) => {\n if (!poolIndex.has(acc.address)) {\n poolIndex.set(acc.address, i);\n }\n });\n\n // Append CPI accounts, deduplicating against the pool.\n for (const accounts of accountLists) {\n for (const acc of accounts) {\n const existingIdx = poolIndex.get(acc.address);\n if (existingIdx === undefined) {\n const idx = pool.length;\n poolIndex.set(acc.address, idx);\n pool.push({ ...acc });\n } else {\n // Upgrade role on the first-occurrence entry (most permissive wins).\n const existing = pool[existingIdx];\n if (isRoleWritable(acc.role) && !isRoleWritable(existing.role)) {\n existing.role = upgradeRoleToWritable(existing.role);\n }\n if (isRoleSigner(acc.role) && !isRoleSigner(existing.role)) {\n existing.role = upgradeRoleToSigner(existing.role);\n }\n }\n }\n }\n\n return { pool, poolIndex };\n}\n\n// ============================================================================\n// Shared Internal Helpers\n// ============================================================================\n\n/**\n * Build a deduplicated account pool from CPI account lists, respecting\n * optional `initialAccounts` ordering.\n */\nfunction buildPool(\n accountLists: CustomAccountMeta[][],\n options?: DeduplicateOptions\n): { pool: CustomAccountMeta[]; poolIndex: Map<Address, number> } {\n if (options?.initialAccounts) {\n return buildPoolWithOrderedInitial(options.initialAccounts, accountLists);\n }\n\n const poolMap = buildDeduplicatedPool(accountLists);\n const pool = Array.from(poolMap.values());\n const poolIndex = new Map<Address, number>();\n pool.forEach((acc, i) => poolIndex.set(acc.address, i));\n return { pool, poolIndex };\n}\n\n/**\n * Resolve tracked addresses to their indices in the pool.\n */\nfunction resolveTrackedIndices(\n poolIndex: Map<Address, number>,\n trackAddresses?: Address[]\n): number[] {\n if (!trackAddresses) return [];\n\n return trackAddresses.map((addr) => {\n const idx = poolIndex.get(addr);\n if (idx === undefined) {\n throw new Error(`Tracked address ${addr} not found in pool`);\n }\n return idx;\n });\n}\n\n/**\n * Build a single `InstructionRefs` from a flat list of CPIs and their\n * pre-built account lists, all indexing into a shared pool.\n */\nfunction buildInstructionRefs(\n cpis: CpiData[],\n accountLists: CustomAccountMeta[][],\n poolIndex: Map<Address, number>,\n trackedIndices: number[]\n): InstructionRefs {\n const allIndices: number[] = [];\n const lengths: number[] = [];\n const cpiTypes: number[] = [];\n const cpiArgs = new CpiArgsBuilder();\n\n for (let i = 0; i < cpis.length; i++) {\n const indices = buildIndicesForCpi(accountLists[i], poolIndex);\n allIndices.push(...indices);\n lengths.push(indices.length);\n cpiTypes.push(cpis[i].cpiType);\n\n if (cpis[i].data !== undefined) {\n cpiArgs.add(cpis[i].data!);\n } else {\n cpiArgs.skip();\n }\n }\n\n return {\n cpi: {\n accounts: {\n indices: Buffer.from(allIndices),\n lengths: Buffer.from(lengths),\n },\n types: Buffer.from(cpiTypes),\n args: cpiArgs.build(),\n },\n tracked: Buffer.from(trackedIndices),\n };\n}\n\n/** Prepend the program account to each CPI's account list. */\nfunction toCpiAccountLists(cpis: CpiData[]): CustomAccountMeta[][] {\n return cpis.map((cpi) => [toCustomAccountMeta(cpi.programId), ...cpi.accounts]);\n}\n\n/** Collect all lookup tables from a flat list of CPIs. */\nfunction collectLookupTables(cpis: CpiData[]): Address[] {\n return cpis.flatMap((x) => x.lookupTables ?? []);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Result of creating multiple separate CPI ref groups from a shared account pool.\n */\nexport interface CreateMultiCpiRefsResult {\n /** The single deduplicated pool of unique accounts (pass as remainingAccounts) */\n accounts: CustomAccountMeta[];\n /** One InstructionRefs per input group, all indexing into the shared pool */\n refsGroups: InstructionRefs[];\n lookupTables: Address[];\n}\n\n/**\n * Deduplicate multiple groups of CPI data into a single shared account pool,\n * returning separate `InstructionRefs` for each group.\n *\n * Use this when an instruction accepts multiple independent refs arguments\n * (e.g. `ybIxRefs` + `tokenIxRefs`) that must index into the same\n * `remainingAccounts` pool.\n *\n * @param cpiGroups - Array of CPI data groups; each group produces one InstructionRefs\n * @param options - Optional initial accounts and tracked addresses\n *\n * @example\n * ```typescript\n * const swapCpis = [jupiterSwapCpiData];\n * const repayCpis = [kaminoRepayCpiData];\n *\n * const { accounts, refsGroups } = createMultiCpiRefs(\n * [swapCpis, repayCpis],\n * { initialAccounts: carryTradeAccounts }\n * );\n * const [ybIxRefs, tokenIxRefs] = refsGroups;\n * ```\n */\nexport function createMultiCpiRefs(\n cpiGroups: CpiData[][],\n options?: DeduplicateOptions\n): CreateMultiCpiRefsResult {\n const allCpis = cpiGroups.flat();\n const allAccountLists = toCpiAccountLists(allCpis);\n\n const { pool, poolIndex } = buildPool(allAccountLists, options);\n const trackedIndices = resolveTrackedIndices(poolIndex, options?.trackAddresses);\n\n let flatIdx = 0;\n const refsGroups: InstructionRefs[] = cpiGroups.map((group) => {\n const groupAccountLists = allAccountLists.slice(flatIdx, flatIdx + group.length);\n flatIdx += group.length;\n return buildInstructionRefs(group, groupAccountLists, poolIndex, trackedIndices);\n });\n\n return {\n accounts: stripSignerFromAccounts(pool),\n refsGroups,\n lookupTables: collectLookupTables(allCpis),\n };\n}\n\n/**\n * Deduplicate multiple CPI account lists into a single pool with CPI refs.\n *\n * Accepts any array of objects with `cpiType` and `accounts`, including `CpiData[]`.\n *\n * @param cpis - Array of CPI inputs (each with cpiType and accounts)\n * @param options - Optional configuration (e.g., addresses to track)\n * @returns Deduplicated pool and CPI refs\n *\n * @example\n * ```typescript\n * // CpiData includes cpiType, so pass it directly\n * const perenaIx = await perenaClient.getSwapCpiData(quote, pda);\n * const jupiterIx = await jupiterClient.getSwapCpiData(quote, pda);\n *\n * const { accounts, refs } = createCpiRefs([perenaIx, jupiterIx]);\n *\n * // Use accounts as remainingAccounts, refs as instruction arg\n * ```\n */\nexport function createCpiRefs(cpis: CpiData[], options?: DeduplicateOptions): CreateCpiRefsResult {\n const accountLists = toCpiAccountLists(cpis);\n const { pool, poolIndex } = buildPool(accountLists, options);\n const trackedIndices = resolveTrackedIndices(poolIndex, options?.trackAddresses);\n\n return {\n accounts: stripSignerFromAccounts(pool),\n refs: buildInstructionRefs(cpis, accountLists, poolIndex, trackedIndices),\n lookupTables: collectLookupTables(cpis),\n };\n}\n","import { BN } from \"@anchor-lang/core\";\nimport { Address, type Instruction, type TransactionSigner, Rpc, SolanaRpcApi } from \"@solana/kit\";\nimport {\n getRequestHeapFrameInstruction,\n getSetComputeUnitLimitInstruction,\n getSetComputeUnitPriceInstruction,\n} from \"@solana-program/compute-budget\";\nimport {\n fetchMaybeToken,\n getCreateAssociatedTokenIdempotentInstruction,\n getSyncNativeInstruction,\n getCloseAccountInstruction,\n TOKEN_PROGRAM_ADDRESS,\n} from \"@solana-program/token\";\nimport { getTransferSolInstruction } from \"@solana-program/system\";\nimport { type BaseAccountClient, SPL_ATA_CACHE_CATEGORY } from \"../services/baseAccountClient\";\nimport type { TransactionCacheInvalidation } from \"../types/general\";\nimport { CustomAccountMeta } from \"../types\";\nimport { createSignerFromAddress, isTransactionSigner } from \"./solana\";\nimport { getAtaAddress } from \"./accounts/pda\";\nimport { allAccountsExist } from \"./accounts/rpc\";\nimport { mints } from \"../services/mints\";\n\nexport function setComputeUnitLimitIx(maxComputeUnits: number): Instruction {\n return getSetComputeUnitLimitInstruction({\n units: maxComputeUnits,\n });\n}\n\nexport function setComputeUnitPriceIx(microLamports: number): Instruction {\n return getSetComputeUnitPriceInstruction({\n microLamports,\n });\n}\n\n/**\n * Request a larger BPF heap for the transaction (default is 32 KiB).\n * Use for instructions that chain many CPIs and allocate temporary `Vec`s\n * (e.g. burn-with-unwind through Perena + Kamino).\n *\n * @param bytes - Must be a multiple of 1024; Solana allows up to 256 KiB.\n */\nexport function requestHeapFrameIx(bytes: number): Instruction {\n return getRequestHeapFrameInstruction({ bytes });\n}\n\n/**\n * Scans accounts for required ATAs, checks which ones exist on-chain in a\n * single batched RPC call, and returns idempotent create-ATA instructions\n * for any that are missing.\n *\n * @param rpc - Solana RPC client\n * @param payer - Fee payer for ATA creation\n * @param accounts - Account metas to scan (from CpiData, etc.)\n * @returns Create-ATA instructions and SPL ATA cache invalidations for each new ATA\n */\nexport async function getCreateAtaInstructions(\n rpc: Rpc<SolanaRpcApi>,\n payer: Address,\n accounts: CustomAccountMeta[]\n): Promise<{\n instructions: Instruction[];\n postSuccessCacheInvalidations: TransactionCacheInvalidation[];\n}> {\n // Collect unique accounts that are marked as required ATAs\n const requiredAtas = accounts.filter((x) => x.isRequiredAta);\n\n if (!requiredAtas.length) {\n return { instructions: [], postSuccessCacheInvalidations: [] };\n }\n\n const { existsByAddress } = await allAccountsExist(\n rpc,\n requiredAtas.map((account) => account.address)\n );\n\n const payerSigner = createSignerFromAddress(payer);\n const instructions: Instruction[] = [];\n const postSuccessCacheInvalidations: TransactionCacheInvalidation[] = [];\n\n for (const account of requiredAtas) {\n if (!existsByAddress.get(account.address)) {\n const seeds = account.isRequiredAta!;\n instructions.push(\n getCreateAssociatedTokenIdempotentInstruction({\n payer: payerSigner,\n ata: account.address,\n owner: seeds.owner,\n mint: seeds.mint,\n tokenProgram: seeds.tokenProgram,\n })\n );\n postSuccessCacheInvalidations.push({ client: SPL_ATA_CACHE_CATEGORY, ata: account.address });\n }\n }\n\n return { instructions, postSuccessCacheInvalidations };\n}\n\nexport interface GetCreateAtaIxIfNeededOptions {\n /**\n * When set, {@link BaseAccountClient#splAtaExists} is used instead of a one-off\n * `fetchMaybeToken` RPC read (shared cache + consistent behavior with program SDKs).\n */\n accountClient?: BaseAccountClient;\n}\n\nexport interface CreateAtaIxIfNeededResult {\n instruction: Instruction | null;\n postSuccessCacheInvalidations: TransactionCacheInvalidation[];\n}\n\n/**\n * Checks if an ATA exists on-chain and returns a create-ATA instruction if it\n * doesn't.\n *\n * @param rpc - Solana RPC client (used for the default existence check unless overridden)\n * @param payer - Fee payer for ATA creation\n * @param mint - Token mint address\n * @param owner - Owner of the ATA\n * @param tokenProgram - Token program (defaults to TOKEN_PROGRAM_ADDRESS)\n * @param options - Optional account client for SPL ATA existence (otherwise uses RPC read)\n */\nexport async function getCreateAtaIxIfNeeded(\n rpc: Rpc<SolanaRpcApi>,\n payer: Address | TransactionSigner,\n mint: Address,\n owner: Address,\n tokenProgram: Address = TOKEN_PROGRAM_ADDRESS,\n options?: GetCreateAtaIxIfNeededOptions\n): Promise<CreateAtaIxIfNeededResult> {\n const ata = await getAtaAddress(mint, owner, tokenProgram);\n\n const exists =\n options?.accountClient !== undefined\n ? await options.accountClient.splAtaExists(ata)\n : (await fetchMaybeToken(rpc, ata)).exists;\n\n if (exists) {\n return { instruction: null, postSuccessCacheInvalidations: [] };\n }\n\n const payerSigner = isTransactionSigner(payer) ? payer : createSignerFromAddress(payer);\n\n const instruction = getCreateAssociatedTokenIdempotentInstruction({\n payer: payerSigner,\n ata,\n owner,\n mint,\n tokenProgram,\n });\n\n return {\n instruction,\n postSuccessCacheInvalidations: [{ client: SPL_ATA_CACHE_CATEGORY, ata }],\n };\n}\n\nexport interface WrapSolInstructionsResult {\n instructions: Instruction[];\n postSuccessCacheInvalidations: TransactionCacheInvalidation[];\n}\n\n/**\n * Returns instructions to wrap SOL into WSOL for a given wallet.\n *\n * Creates the WSOL ATA (idempotent), transfers SOL into it, and syncs the\n * native balance so the token account reflects the deposited lamports.\n */\nexport async function getWrapSolInstructions(\n rpc: Rpc<SolanaRpcApi>,\n owner: Address,\n payer: TransactionSigner,\n lamports: BN,\n createAtaOptions?: GetCreateAtaIxIfNeededOptions\n): Promise<WrapSolInstructionsResult> {\n const solMint = mints.get(\"SOL\")!;\n const solMintAddress = solMint.address;\n const ata = await getAtaAddress(solMintAddress, owner);\n\n const { instruction: createAtaIx, postSuccessCacheInvalidations } = await getCreateAtaIxIfNeeded(\n rpc,\n payer,\n solMintAddress,\n owner,\n TOKEN_PROGRAM_ADDRESS,\n createAtaOptions\n );\n\n const instructions: Instruction[] = [];\n if (createAtaIx) instructions.push(createAtaIx);\n\n instructions.push(\n getTransferSolInstruction({\n source: payer,\n destination: ata,\n amount: BigInt(lamports.toString()),\n }),\n getSyncNativeInstruction({ account: ata })\n );\n\n return { instructions, postSuccessCacheInvalidations };\n}\n\n/**\n * Returns instruction to unwrap WSOL back into SOL for a given wallet.\n *\n * Closes the WSOL token account, sending all lamports (including the wrapped\n * SOL balance and the rent-exempt reserve) to the specified destination.\n *\n * @param owner - Wallet that owns the WSOL ATA (must be a TransactionSigner to authorize the close)\n * @param destination - Address to receive the unwrapped SOL (defaults to the owner's address)\n * @returns Instructions to include in a transaction\n */\nexport async function getUnwrapSolInstruction(\n owner: TransactionSigner,\n destination?: Address\n): Promise<Instruction> {\n const solMint = mints.get(\"SOL\");\n if (!solMint) throw new Error(\"WSOL mint not found in registry\");\n const solMintAddress = solMint.address;\n const ata = await getAtaAddress(solMintAddress, owner.address);\n\n return getCloseAccountInstruction({\n account: ata,\n destination: destination ?? owner.address,\n owner,\n });\n}\n","import {\n createKeyPairSignerFromBytes,\n type Address,\n type KeyPairSigner,\n type Rpc,\n type Signature,\n type SolanaRpcApi,\n type TransactionSigner,\n} from \"@solana/kit\";\nimport { Keypair } from \"@solana/web3.js\";\nimport fs from \"fs\";\nimport { resolveFp } from \"./general\";\n\nexport function createSignerFromAddress(address: Address): TransactionSigner {\n return { address } as TransactionSigner;\n}\n\nexport async function getSlot(\n rpc: Rpc<SolanaRpcApi>,\n commitment: \"processed\" | \"confirmed\" | \"finalized\" = \"confirmed\"\n) {\n return rpc.getSlot({ commitment }).send();\n}\n\nexport function isTransactionSigner(x: unknown): x is TransactionSigner {\n return (\n typeof x === \"object\" &&\n x !== null &&\n \"address\" in x &&\n typeof (x as TransactionSigner).address === \"string\"\n );\n}\n\n/** Raw secret key bytes from a Solana CLI JSON keypair file. */\nexport function readLocalKeypairSecret(keypairPath: string): Uint8Array {\n const walletData = JSON.parse(fs.readFileSync(resolveFp(keypairPath), \"utf-8\"));\n return new Uint8Array(walletData);\n}\n\n/**\n * Loads a Solana keypair signer from a JSON file on disk.\n * @param keypairPath - Path to the JSON keypair file (e.g. ~/.config/solana/tp/id.json)\n */\nexport async function loadLocalKeypair(\n keypairPath = \"~/.config/solana/tp/id.json\"\n): Promise<KeyPairSigner> {\n return createKeyPairSignerFromBytes(readLocalKeypairSecret(keypairPath), true);\n}\n\n/**\n * Same keypair file as {@link loadLocalKeypair}, returned as both a Kit signer and a\n * `@solana/web3.js` {@link Keypair} for Anchor (`AnchorProvider` / `Wallet`).\n *\n * Kit's `KeyPairSigner.keyPair` is a Web Crypto `CryptoKeyPair`, not a web3.js `Keypair`.\n */\nexport async function loadLocalKeypairWithWeb3(\n keypairPath = \"~/.config/solana/tp/id.json\"\n): Promise<{ signer: KeyPairSigner; web3Keypair: Keypair }> {\n const secret = readLocalKeypairSecret(keypairPath);\n const signer = await createKeyPairSignerFromBytes(secret, true);\n const web3Keypair = Keypair.fromSecretKey(secret);\n return { signer, web3Keypair };\n}\n\nexport async function logTxMessages(rpc: Rpc<SolanaRpcApi>, sig: Signature) {\n const info = await rpc\n .getTransaction(sig, {\n commitment: \"confirmed\",\n encoding: \"base64\",\n })\n .send();\n\n console.log((info?.meta?.logMessages ?? []).join(\"\\n\"));\n}\n","import { Address } from \"@solana/kit\";\nimport os from \"os\";\nimport path from \"path\";\n\nexport function resolveFp(keypairFp: string) {\n // Expand ~ to home dir\n if (keypairFp.startsWith(\"~\")) {\n keypairFp = path.join(os.homedir(), keypairFp.slice(1));\n }\n\n // Resolve relative paths to absolute ones\n keypairFp = path.resolve(keypairFp);\n\n return keypairFp;\n}\n\nexport function deduplicateAccounts(addresses: Address[]) {\n return Array.from(new Set(addresses).values());\n}\n\n/**\n * Returns items in encounter order; later entries with the same `key(item)` are skipped.\n */\nexport function dedupeOrdered<T>(items: readonly T[], key: (item: T) => string): T[] {\n const ordered: T[] = [];\n const seen = new Set<string>();\n for (const item of items) {\n const k = key(item);\n if (seen.has(k)) continue;\n seen.add(k);\n ordered.push(item);\n }\n return ordered;\n}\n\n/**\n * {@link dedupeOrdered} for Solana Kit `Address` values (compares base58 strings).\n */\nexport function dedupeOrderedAddresses(addresses: readonly Address[]): Address[] {\n return dedupeOrdered(addresses, (a) => a as string);\n}\n\n/** Return `addresses` excluding any address present in `excluded`. */\nexport function filterSpecificAccounts(\n addresses: readonly Address[],\n excluded: readonly Address[]\n): Address[] {\n const excludedSet = new Set<Address>(excluded);\n return addresses.filter((address) => !excludedSet.has(address));\n}\n\nexport function zip<T, U>(list1: T[], list2: U[]): [T, U][] {\n const minLength = Math.min(list1.length, list2.length);\n const result: [T, U][] = [];\n\n for (let i = 0; i < minLength; i++) {\n result.push([list1[i], list2[i]]);\n }\n\n return result;\n}\n\n/**\n * Returns the element with the highest numeric score. Throws if `items` is empty.\n */\nexport function maxByNumber<T>(items: T[], score: (item: T) => number): T {\n if (items.length === 0) {\n throw new Error(\"maxByNumber: empty items\");\n }\n let best = items[0]!;\n let bestScore = score(best);\n for (let i = 1; i < items.length; i++) {\n const item = items[i]!;\n const s = score(item);\n if (s > bestScore) {\n best = item;\n bestScore = s;\n }\n }\n return best;\n}\n\nexport function createRecord<T>(keys: string[], values: T[]): Record<string, T> {\n return Object.fromEntries(zip(keys, values).map(([k, v]) => [k.toString(), v]));\n}\n\n/**\n * Case-insensitive key lookup on a record. Returns the first matching key, or undefined.\n */\nexport function findKeyIgnoreCase(\n record: Record<string, unknown>,\n key: string\n): string | undefined {\n const lower = key.toLowerCase();\n return Object.keys(record).find((k) => k.toLowerCase() === lower);\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { Address } from \"@solana/kit\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport type { AssetType, MintConfig, MintInfo, MintRegistryOptions } from \"./types\";\nimport { DEFAULT_MINTS } from \"./defaults\";\nimport { MintIdentifier } from \"../../types\";\nimport { toUiAmount, fromUiAmount } from \"../../utils/numbers\";\n\n/**\n * Registry for token mint information.\n *\n * Provides a unified interface to query token metadata by address or symbol.\n * Supports both well-known tokens and custom configurations.\n *\n * @example\n * ```typescript\n * // Create registry with defaults\n * const mints = new MintRegistry();\n *\n * // Query by symbol\n * const usdc = mints.get(\"USDC\");\n * console.log(usdc?.decimals); // 6\n *\n * // Query by address\n * const token = mints.get(someAddress);\n * console.log(token?.symbol); // \"USDC\"\n *\n * // Add custom tokens\n * const mints = new MintRegistry({\n * custom: [{ address: \"...\", symbol: \"MY_TOKEN\", decimals: 9 }]\n * });\n * ```\n */\nexport class MintRegistry {\n private byAddress: Map<Address, MintInfo> = new Map();\n private bySymbol: Map<string, MintInfo> = new Map();\n\n constructor(options: MintRegistryOptions = {}) {\n const { includeDefaults = true, custom = [] } = options;\n\n if (includeDefaults) {\n for (const config of DEFAULT_MINTS) {\n this.register(config);\n }\n }\n\n for (const config of custom) {\n this.register(config);\n }\n }\n\n /**\n * Register a new mint configuration.\n * Overwrites existing entries with the same address or symbol.\n */\n register(config: MintConfig): void {\n const mintInfo: MintInfo = {\n ...config,\n tokenProgram: config.isToken2022 ? TOKEN_2022_PROGRAM_ADDRESS : TOKEN_PROGRAM_ADDRESS,\n toUiAmount: (amount) => toUiAmount(amount, config.decimals),\n fromUiAmount: (amount) => fromUiAmount(amount, config.decimals),\n };\n this.byAddress.set(config.address, mintInfo);\n this.bySymbol.set(config.symbol.toUpperCase(), mintInfo);\n }\n\n /**\n * Get mint information by address or symbol.\n *\n * @param mint - Mint address or token symbol (case-insensitive)\n * @returns MintInfo if found, undefined otherwise\n *\n * @example\n * ```typescript\n * mints.get(\"USDC\")?.decimals // 6\n * mints.get(usdcAddress)?.symbol // \"USDC\"\n * ```\n */\n get(mint: MintIdentifier): MintInfo | undefined {\n const upperKey = mint.toUpperCase();\n const bySymbol = this.bySymbol.get(upperKey);\n if (bySymbol) {\n return bySymbol;\n }\n\n return this.byAddress.get(mint as Address);\n }\n\n all(): MintInfo[] {\n return Array.from(this.byAddress.values());\n }\n\n standardAssets(): MintInfo[] {\n return this.filterAssetsByType(\"Standard\");\n }\n\n stablecoins(): MintInfo[] {\n return this.filterAssetsByType(\"Stablecoin\");\n }\n\n lsts(): MintInfo[] {\n return this.filterAssetsByType(\"LST\");\n }\n\n yieldBearingAssets(): MintInfo[] {\n return this.filterAssetsByType(\"YBA\");\n }\n\n filterAssetsByType(assetType: AssetType) {\n return Array.from(this.byAddress.values()).filter((x) => x.assetType === assetType);\n }\n\n symbols(): string[] {\n return Array.from(this.bySymbol.keys());\n }\n\n addresses(): Address[] {\n return Array.from(this.byAddress.keys());\n }\n}\n\n/**\n * Default MintRegistry instance with well-known tokens.\n * Use this for quick access without creating a new instance.\n *\n * @example\n * ```typescript\n * import { mints } from \"./services/mints\";\n * const usdc = mints.get(\"USDC\");\n * ```\n */\nexport const mints = new MintRegistry();\n","import { address } from \"@solana/kit\";\nimport type { MintConfig } from \"./types\";\n\nexport const DEFAULT_MINTS: MintConfig[] = [\n // Risk assets\n {\n address: address(\"So11111111111111111111111111111111111111112\"),\n symbol: \"SOL\",\n name: \"Solana\",\n decimals: 9,\n assetType: \"Standard\",\n },\n {\n address: address(\"3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh\"),\n symbol: \"wBTC\",\n name: \"Wrapped Bitcoin\",\n decimals: 8,\n assetType: \"Standard\",\n },\n {\n address: address(\"cbbtcf3aa214zXHbiAZQwf4122FBYbraNdFqgw4iMij\"),\n symbol: \"cbBTC\",\n name: \"Coinbase Wrapped Bitcoin\",\n decimals: 8,\n assetType: \"Standard\",\n },\n {\n address: address(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\"),\n symbol: \"wETH\",\n name: \"Wrapped Ethereum\",\n decimals: 8,\n assetType: \"Standard\",\n },\n {\n address: address(\"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4\"),\n symbol: \"JLP\",\n name: \"Jupiter Perps LP\",\n decimals: 6,\n assetType: \"Standard\",\n },\n {\n address: address(\"XsoCS1TfEyfFhfvj8EtZ528L3CaKBDBRqRapnBbDF2W\"),\n symbol: \"SPYx\",\n name: \"SP500 xStock\",\n decimals: 8,\n assetType: \"Standard\",\n isToken2022: true,\n },\n {\n address: address(\"Xs8S1uUs1zvS2p7iwtsG3b6fkhpvmwz4GYU3gWAmWHZ\"),\n symbol: \"QQQx\",\n name: \"Nasdaq xStock\",\n decimals: 8,\n assetType: \"Standard\",\n isToken2022: true,\n },\n // Stablecoins\n {\n address: address(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n assetType: \"Stablecoin\",\n },\n {\n address: address(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\"),\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n assetType: \"Stablecoin\",\n },\n {\n address: address(\"USDSwr9ApdHk5bvJKMjzff41FfuX8bSxdKcR81vTwcA\"),\n symbol: \"USDS\",\n decimals: 6,\n assetType: \"Stablecoin\",\n },\n {\n address: address(\"2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH\"),\n symbol: \"USDG\",\n name: \"Global Dollar\",\n decimals: 6,\n assetType: \"Stablecoin\",\n isToken2022: true,\n },\n {\n address: address(\"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo\"),\n symbol: \"PYUSD\",\n name: \"PayPal USD\",\n decimals: 6,\n assetType: \"Stablecoin\",\n isToken2022: true,\n },\n {\n address: address(\"CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH\"),\n symbol: \"CASH\",\n decimals: 6,\n assetType: \"Stablecoin\",\n isToken2022: true,\n },\n {\n address: address(\"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB\"),\n symbol: \"USD1\",\n decimals: 6,\n assetType: \"Stablecoin\",\n },\n // LSTs\n {\n address: address(\"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn\"),\n symbol: \"JitoSOL\",\n name: \"Jito SOL\",\n decimals: 9,\n assetType: \"LST\",\n },\n {\n address: address(\"jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v\"),\n symbol: \"JupSOL\",\n name: \"Jupiter Staked SOL\",\n decimals: 9,\n assetType: \"LST\",\n },\n {\n address: address(\"sctmB7GPi5L2Q5G9tUSzXvhZ4YiDMEGcRov9KfArQpx\"),\n symbol: \"dfdvSOL\",\n name: \"DeFi Development Corp SOL\",\n decimals: 9,\n assetType: \"LST\",\n },\n // Yield bearing assets\n {\n address: address(\"star9agSpjiFe3M49B3RniVU4CMBBEK3Qnaqn3RGiFM\"),\n symbol: \"USD*\",\n name: \"USD Star\",\n decimals: 6,\n assetType: \"YBA\",\n },\n {\n address: address(\"3AJYCjrhKitmBd8tRUurPA5dGHCAQh6A8L9DkuSC37Rm\"),\n symbol: \"USD*-J\",\n name: \"USD Star Junior\",\n decimals: 6,\n assetType: \"YBA\",\n },\n {\n address: address(\"59obFNBzyTBGowrkif5uK7ojS58vsuWz3ZCvg6tfZAGw\"),\n symbol: \"PST\",\n name: \"PayFi Strategy Token\",\n decimals: 6,\n assetType: \"YBA\",\n },\n];\n","import { BN } from \"@anchor-lang/core\";\nimport { BPS_DENOMINATOR, TVL_USD_SCALE } from \"../constants/general\";\n\nexport const U64_MAX = BigInt(\"18446744073709551615\");\nexport const U64_MAX_BN = new BN(U64_MAX.toString());\n\nexport function toUiAmount(amount: bigint | BN, decimals: number): number {\n const bigintValue = typeof amount === \"bigint\" ? amount : BigInt(amount.toString());\n\n // Treat max u64 as unlimited\n if (bigintValue >= U64_MAX) {\n return Infinity;\n }\n\n // For values that fit in safe integer range, convert directly\n if (bigintValue <= BigInt(Number.MAX_SAFE_INTEGER)) {\n return Number(bigintValue) / Math.pow(10, decimals);\n }\n\n // For large values, divide first using BigInt then convert\n // This preserves more precision for the significant digits\n const divisor = BigInt(Math.pow(10, decimals));\n const wholePart = bigintValue / divisor;\n const remainder = bigintValue % divisor;\n return Number(wholePart) + Number(remainder) / Math.pow(10, decimals);\n}\n\nexport function fromUiAmount(amount: number, decimals: number) {\n return new BN(Math.round(amount * Math.pow(10, decimals)));\n}\n\n/** Base-unit amount representing exactly 1 whole token for `decimals`. */\nexport function wholeTokenAmount(decimals: number): number {\n return Math.pow(10, decimals);\n}\n\n/**\n * Compute USD TVL from a raw token amount and a raw oracle price, normalized\n * to 8-decimal USD ($1 = 100_000_000).\n *\n * Mirrors the on-chain `calculate_tvl_usd`:\n * `tvl = amount * price / (10^(2*decimals) / 10^8)`\n *\n * Oracle prices are scaled to `10^decimals` per dollar (e.g. $1 USDC at 6 dec\n * = 1_000_000; $130 SOL at 9 dec = 130_000_000_000).\n */\nexport function calculateTvlUsd(amount: bigint, price: bigint, decimals: number): bigint {\n const assetScale = BigInt(wholeTokenAmount(decimals));\n const scaleFactor = (assetScale * assetScale) / TVL_USD_SCALE;\n return (amount * price) / scaleFactor;\n}\n\n/**\n * Inverse of {@link calculateTvlUsd}: convert a normalized 8-decimal USD value\n * back to base units given a raw oracle price and decimal precision.\n *\n * `amount = tvlUsd * (10^(2*decimals) / 10^8) / price`\n */\nexport function tvlUsdToBaseUnits(tvlUsd: bigint, price: bigint, decimals: number): bigint {\n const assetScale = BigInt(wholeTokenAmount(decimals));\n const scaleFactor = (assetScale * assetScale) / TVL_USD_SCALE;\n return (tvlUsd * scaleFactor) / price;\n}\n\n/** `bigint` → Anchor `BN` without floating-point loss (e.g. raw lamports / token amounts). */\nexport function bnFromBigInt(n: bigint): BN {\n return new BN(n.toString());\n}\n\n/**\n * `bigint × number → bigint` with sign-preserving half-away-from-zero rounding.\n *\n * JS has no native `bigint * float` op; we go through `Number(a) * b` and\n * round. Precision loss is bounded by Number's ~15 significant digits, which\n * is well inside sub-cent tolerance for realistic token balances. Returns\n * `0n` when either input is zero or the multiplier is non-finite.\n *\n * Typical use: applying a floating-point rate (NAV, APY multiplier, oracle\n * price per UI) to an integer base-unit balance.\n */\nexport function bigintMulNumber(a: bigint, b: number): bigint {\n if (a === 0n || !Number.isFinite(b) || b === 0) return 0n;\n return BigInt(Math.round(Number(a) * b));\n}\n\n/**\n * Ceiling-round `principal * feeRate`, returning the result as a bigint.\n *\n * Use this when undershooting the fee can cause a transaction to fail (e.g.\n * a flash-loan repay that must cover principal + fee — over-paying by at most\n * one base unit is fine, under-paying reverts).\n *\n * `feeRate` is a unitless fraction (e.g. `0.003` for 0.3%). Returns `0n` for\n * non-positive rates.\n */\nexport function applyFeeCeil(principal: bigint, feeRate: number): bigint {\n if (feeRate <= 0) return 0n;\n // Scale rate to 1e9 for integer math; ceil so we over-pay by at most one unit.\n const scale = 1_000_000_000n;\n const rateScaled = BigInt(Math.ceil(feeRate * Number(scale)));\n const numerator = principal * rateScaled;\n return (numerator + (scale - 1n)) / scale;\n}\n\nexport function getBatches<T>(items: T[], batchSize: number): T[][] {\n const batches: T[][] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n return batches;\n}\n\nexport function currentUnixSeconds() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function sum(numbers: number[]) {\n return numbers.reduce((prev, curr) => prev + curr, 0);\n}\n\nexport function toBigInt(value: BN | number | bigint) {\n return BigInt(value.toString());\n}\n\n/** Apply a basis-points multiplier: `(value × bps) / 10_000`. */\nexport function applyBps(value: bigint, bps: bigint | number): bigint {\n return (value * BigInt(bps)) / BPS_DENOMINATOR;\n}\n\n/** Compute the basis-points ratio: `(part / whole) × 10_000`. */\nexport function toBps(part: bigint, whole: bigint): bigint {\n if (whole === 0n) return 0n;\n return (part * BPS_DENOMINATOR) / whole;\n}\n\nexport function toSafeNumber(value: bigint | BN, field: string) {\n const asBigInt = typeof value === \"bigint\" ? value : BigInt(value.toString());\n if (asBigInt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`${field} exceeds Number.MAX_SAFE_INTEGER and cannot be quoted safely`);\n }\n\n return Number(asBigInt);\n}\n\nfunction numberToLEBytes(value: number | bigint | BN, byteLength = 8): Uint8Array {\n const bigintValue = typeof value === \"bigint\" ? value : BigInt(value.toString());\n const buf = new ArrayBuffer(byteLength);\n const view = new DataView(buf);\n\n if (byteLength === 8) {\n view.setBigUint64(0, bigintValue, true);\n } else {\n // Generic little-endian encoding for other byte lengths\n let remaining = bigintValue;\n for (let i = 0; i < byteLength; i++) {\n view.setUint8(i, Number(remaining & 0xffn));\n remaining >>= 8n;\n }\n }\n\n return new Uint8Array(buf);\n}\n\nexport function numToU64Bytes(value: number | bigint | BN) {\n return numberToLEBytes(value, 8);\n}\n\nexport function numToU32Bytes(value: number | bigint | BN) {\n return numberToLEBytes(value, 4);\n}\n\nexport function numToU16Bytes(value: number | bigint | BN) {\n return numberToLEBytes(value, 2);\n}\n\n/**\n * Compute annualized percentage yield from two price snapshots.\n *\n * Formula:\n * growthRate = priceEnd / priceStart\n * APY = (growthRate ^ (365 / daysBetween) - 1) * 100\n *\n * Returns `null` if either price is missing/zero or the time delta is zero.\n */\nexport function computeApy(\n priceEnd: number,\n priceStart: number,\n windowSeconds: number\n): number | null {\n const SECONDS_PER_DAY = 86_400;\n const DAYS_PER_YEAR = 365;\n\n if (priceStart <= 0 || priceEnd <= 0 || windowSeconds <= 0) return null;\n\n const daysBetween = windowSeconds / SECONDS_PER_DAY;\n const growthRate = priceEnd / priceStart;\n const apy = (Math.pow(growthRate, DAYS_PER_YEAR / daysBetween) - 1) * 100;\n return Number.isFinite(apy) ? apy : null;\n}\n","import { address, Address } from \"@solana/kit\";\nimport type { DeployedEnv, Environment } from \"../types\";\n\nexport const ENVIRONMENT: Environment = (process.env.ENVIRONMENT as Environment) ?? \"local\";\n\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\nexport const DAYS_PER_YEAR = 365;\nexport const TVL_USD_DECIMAL_PLACES = 8;\nexport const TVL_USD_SCALE = BigInt(10 ** TVL_USD_DECIMAL_PLACES);\nexport const BPS_DENOMINATOR = 10_000n;\nexport const DEFAULT_PUBLIC_KEY: Address = address(\"11111111111111111111111111111111\");\n\nexport const LOCALNET_URL = \"http://127.0.0.1:8899\";\n\nexport const TP_ID_KEYPAIR_FP = \"~/.config/solana/tp/id.json\";\nexport const TP_LUT_MANAGER_KP_FP = \"~/.config/solana/tp/lut-manager.json\";\n\n/**\n * Program-level admin pubkey shared across deployed programs (LYC protocol admin,\n * consensus oracle admin seed, etc.). Matches Rust `PROTOCOL_ADMIN`.\n */\nexport const PROTOCOL_ADMIN: Record<Environment, Address> = {\n local: address(\"7PxS1VMxKbzUTF4sxeAw4LqBfnGMaeQH2KwabmUcVxYC\"),\n test: address(\"8S1Ta7xZVsiqtf9mrUPwXKSNmBPzmsK3RdhonDu3kzk\"),\n prod: address(\"42GmTZiLdcJHmxCik4WvxTYeNirzFqsr7DXWZDst4gxE\"), // TODO: multisig admin\n};\n\n/** Admin keypair paths for deployed (test/prod) CLI scripts. */\nexport const DEPLOYED_ADMIN_KEYPAIR_FP: Record<DeployedEnv, string> = {\n test: \"~/.config/solana/tp/lyc-admin-test.json\",\n prod: \"~/.config/solana/tp/lyc-admin-prod.json\",\n};\n\nexport const PRICE_STALENESS_SECONDS = 60;\n\nexport const METAPLEX_TOKEN_METADATA_PROGRAM_ID: Address = address(\n \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\"\n);\n","import {\n type Rpc,\n type SolanaRpcApi,\n createDefaultRpcTransport,\n createSolanaRpc,\n createSolanaRpcFromTransport,\n} from \"@solana/kit\";\nimport type { Environment } from \"../types\";\nimport { isTransientNetworkError, withNetworkRetry } from \"./retry\";\n\n/**\n * Create a Solana RPC client with automatic retry on transient network\n * failures (connection resets, DNS timeouts, `fetch failed`).\n *\n * Use this instead of `createSolanaRpc(url)` for any non-local RPC endpoint.\n */\nexport function createRpcWithRetry(url: string): Rpc<SolanaRpcApi> {\n const inner = createDefaultRpcTransport({ url });\n const retryingTransport: typeof inner = async <TResponse>(...args: Parameters<typeof inner>) =>\n withNetworkRetry(() => inner(...args)) as Promise<TResponse>;\n return createSolanaRpcFromTransport(retryingTransport);\n}\n\n/**\n * Create a Solana RPC client that retries each provider and then fails over to\n * the next configured provider for transient read failures.\n */\nexport function createRpcWithFailover(urls: string[]): Rpc<SolanaRpcApi> {\n const uniqueUrls = uniqueRpcUrls(urls);\n if (uniqueUrls.length === 0) {\n throw new Error(\"createRpcWithFailover requires at least one RPC URL\");\n }\n if (uniqueUrls.length === 1) {\n return createRpcWithRetry(uniqueUrls[0]);\n }\n\n const providers = uniqueUrls.map((url) => ({\n url,\n transport: createDefaultRpcTransport({ url }),\n }));\n const failoverTransport: (typeof providers)[number][\"transport\"] = async <TResponse>(\n ...args: Parameters<(typeof providers)[number][\"transport\"]>\n ) => {\n const failures: string[] = [];\n for (const provider of providers) {\n try {\n return (await withNetworkRetry(() => provider.transport(...args))) as TResponse;\n } catch (err) {\n if (!isTransientNetworkError(err)) {\n throw err;\n }\n failures.push(\n `${redactRpcUrlForLog(provider.url)}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n throw new Error(`All RPC providers failed: ${failures.join(\" | \")}`);\n };\n\n return createSolanaRpcFromTransport(failoverTransport);\n}\n\nexport function createRpc(environment: Environment): Rpc<SolanaRpcApi> {\n const urls = getRpcUrls(environment);\n if (environment === \"local\") return createSolanaRpc(urls[0]);\n return createRpcWithFailover(urls);\n}\n\nexport function heliusRpcUrl(heliusApiKey: string) {\n return `https://mainnet.helius-rpc.com/?api-key=${heliusApiKey}`;\n}\n\nexport function ironforgeRpcUrl(ironforgeApiKey: string) {\n return `https://rpc.ironforge.network/mainnet?apiKey=${ironforgeApiKey}`;\n}\n\nconst PUBLIC_MAINNET_RPC_URL = \"https://api.mainnet-beta.solana.com\";\n\n/**\n * Returns the RPC URL for the given environment.\n *\n * Resolution order (non-local):\n * 1. `IRONFORGE_API_KEY` env var → constructs Ironforge URL. Preferred over\n * `RPC_URL` so a stray `RPC_URL` (e.g. pointing at Helius) does not silently\n * override Ironforge when both are present.\n * 2. `RPC_URL` env var (explicit override, if set).\n * 3. `HELIUS_API_KEY` env var → constructs Helius URL.\n * 4. None → throws with a clear message.\n *\n * Browser bundles (e.g. Next.js) do not expose arbitrary `process.env` keys to the client.\n * The app may inject these same names at build time — see the frontend `next.config.ts`.\n */\nexport function getRpcUrl(environment: Environment): string {\n return getRpcUrls(environment)[0];\n}\n\nexport function getRpcUrls(environment: Environment): string[] {\n if (environment === \"local\") return [\"http://127.0.0.1:8899\"];\n\n const urls = uniqueRpcUrls([\n process.env.IRONFORGE_API_KEY ? ironforgeRpcUrl(process.env.IRONFORGE_API_KEY) : undefined,\n process.env.RPC_URL,\n process.env.HELIUS_API_KEY ? heliusRpcUrl(process.env.HELIUS_API_KEY) : undefined,\n ]);\n\n if (urls.length > 0) return urls;\n\n throw new Error(\n \"Non-local environment requires an RPC endpoint. \" +\n \"Set RPC_URL, IRONFORGE_API_KEY, or HELIUS_API_KEY.\"\n );\n}\n\n/**\n * Returns the preferred mainnet RPC URL while preserving a public fallback for\n * local tools and tests that need mainnet reads without extra env setup.\n */\nexport function getMainnetRpcUrl(): string {\n try {\n return getRpcUrl(\"prod\");\n } catch {\n return PUBLIC_MAINNET_RPC_URL;\n }\n}\n\n/** Redact API key query params for logs (Helius, Ironforge, etc.). */\nexport function redactRpcUrlForLog(url: string): string {\n return url.replace(/([?&]api-key=)[^&]*/gi, \"$1…\").replace(/([?&]apiKey=)[^&]*/gi, \"$1…\");\n}\n\nfunction uniqueRpcUrls(urls: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const unique: string[] = [];\n for (const url of urls) {\n if (!url) continue;\n const normalized = url.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n unique.push(normalized);\n }\n return unique;\n}\n","import { sleep } from \"./general\";\n\nconst DEFAULT_MAX_ATTEMPTS = 4;\nconst INITIAL_DELAY_MS = 200;\nconst MAX_DELAY_MS = 2000;\n\nexport function isTransientNetworkError(err: unknown): boolean {\n if (err instanceof TypeError) return true;\n const msg = ((err as Error)?.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"fetch failed\") ||\n msg.includes(\"econnreset\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"etimedout\") ||\n msg.includes(\"socket hang up\") ||\n msg.includes(\"network timeout\") ||\n msg.includes(\"all providers failed\") ||\n msg.includes(\"all rpc providers failed\") ||\n msg.includes(\"failed to get info about account\") ||\n msg.includes(\"429\") ||\n msg.includes(\"rate limit\") ||\n msg.includes(\"too many requests\") ||\n msg.includes(\"timeout\") ||\n // Local validators / forked RPCs can intermittently surface account-load\n // issues as a generic internal JSON-RPC error before the account is warmed.\n msg.includes(\"json-rpc error: internal json-rpc error\") ||\n msg.includes(\"json-rpc error: internal error\")\n );\n}\n\nfunction retryDelay(attempt: number): number {\n return Math.min(INITIAL_DELAY_MS * 2 ** attempt, MAX_DELAY_MS);\n}\n\n/**\n * Retry an async function on transient network errors with exponential backoff.\n *\n * Only retries errors that indicate the request never reached the server\n * (`TypeError: fetch failed`, connection resets, timeouts) plus generic\n * internal JSON-RPC errors that local/forked Solana validators can emit\n * transiently while warming cloned accounts. Deterministic application-level\n * errors (HTTP 4xx/5xx, custom program errors, validation failures) are thrown\n * immediately.\n */\nexport async function withNetworkRetry<T>(\n fn: () => Promise<T>,\n maxAttempts = DEFAULT_MAX_ATTEMPTS\n): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (!isTransientNetworkError(err) || attempt === maxAttempts - 1) break;\n await sleep(retryDelay(attempt));\n }\n }\n throw lastErr;\n}\n\n/**\n * Drop-in replacement for `globalThis.fetch` that retries on transient\n * network errors (connection resets, DNS failures, `TypeError: fetch failed`).\n *\n * HTTP error responses (4xx, 5xx) are NOT retried — the server received and\n * processed the request; the caller should decide how to handle those.\n */\nexport function fetchWithRetry(input: string | URL, init?: RequestInit): Promise<Response> {\n return withNetworkRetry(() => fetch(input, init));\n}\n","import { sleep } from \"./general\";\nimport { redactRpcUrlForLog } from \"./rpc\";\n\n/** Thrown when the JSON-RPC error should be retried (rate limits, transient HTTP, transport). */\nexport class JsonRpcTransientError extends Error {\n constructor(\n message: string,\n readonly suggestedDelayMs?: number\n ) {\n super(message);\n this.name = \"JsonRpcTransientError\";\n }\n}\n\nconst RETRYABLE_HTTP = new Set([408, 429, 502, 503, 504]);\n\nfunction parseRetryAfterMs(header: string | null): number | undefined {\n if (!header) return undefined;\n const sec = Number(header.trim());\n if (Number.isFinite(sec) && sec >= 0) return Math.floor(sec * 1000);\n return undefined;\n}\n\nfunction isRetryableJsonRpcError(err: { code: number; message: string } | undefined): boolean {\n if (!err) return false;\n if (err.code === -32429) return true;\n return /rate limit/i.test(err.message);\n}\n\n/**\n * Serialize async work and enforce a minimum gap (ms) between the end of one\n * invocation and the start of the next. Use `minIntervalMs === 0` to disable.\n */\nexport function createMinIntervalThrottle(minIntervalMs: number) {\n if (minIntervalMs <= 0) {\n return async function run<T>(fn: () => Promise<T>): Promise<T> {\n return fn();\n };\n }\n let queue: Promise<unknown> = Promise.resolve();\n let lastEnd = 0;\n return function run<T>(fn: () => Promise<T>): Promise<T> {\n const task = queue.then(async () => {\n const now = Date.now();\n const wait = Math.max(0, minIntervalMs - (now - lastEnd));\n if (wait > 0) await sleep(wait);\n try {\n return await fn();\n } finally {\n lastEnd = Date.now();\n }\n });\n queue = task.then(\n () => undefined,\n () => undefined\n );\n return task as Promise<T>;\n };\n}\n\n/**\n * One JSON-RPC 2.0 POST. Uses raw `fetch` so response JSON matches RPC wire\n * shape (e.g. Helius webhooks) without SDK bigint coercion.\n */\nexport async function jsonRpcFetchOnce<T>(\n rpcUrl: string,\n method: string,\n params: unknown[]\n): Promise<T> {\n let res: Response;\n try {\n res = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n });\n } catch (e) {\n const cause = e instanceof Error ? e.message : String(e);\n const local =\n rpcUrl.includes(\"127.0.0.1\") || rpcUrl.includes(\"localhost\")\n ? \" No process is listening on that URL — start a local validator (e.g. surfpool/solana-test-validator) or set ENVIRONMENT + RPC_URL / HELIUS_API_KEY for a remote endpoint.\"\n : \"\";\n throw new JsonRpcTransientError(\n `RPC ${method} fetch failed (${redactRpcUrlForLog(rpcUrl)}): ${cause}.${local}`\n );\n }\n\n const retryAfterMs = parseRetryAfterMs(res.headers.get(\"Retry-After\"));\n\n if (RETRYABLE_HTTP.has(res.status)) {\n const text = await res.text();\n throw new JsonRpcTransientError(`RPC ${method} HTTP ${res.status}: ${text}`, retryAfterMs);\n }\n\n if (!res.ok) {\n throw new Error(`RPC ${method} HTTP ${res.status}: ${await res.text()}`);\n }\n\n let body: { result?: T; error?: { code: number; message: string; data?: unknown } };\n try {\n body = (await res.json()) as {\n result?: T;\n error?: { code: number; message: string; data?: unknown };\n };\n } catch {\n throw new JsonRpcTransientError(`RPC ${method}: invalid JSON response body`);\n }\n\n if (body.error) {\n const dataStr =\n body.error.data !== undefined\n ? ` data=${JSON.stringify(body.error.data, (_, v) => (typeof v === \"bigint\" ? v.toString() : v))}`\n : \"\";\n if (isRetryableJsonRpcError(body.error)) {\n throw new JsonRpcTransientError(\n `RPC ${method} error ${body.error.code}: ${body.error.message}${dataStr}`,\n retryAfterMs\n );\n }\n throw new Error(`RPC ${method} error ${body.error.code}: ${body.error.message}${dataStr}`);\n }\n\n return body.result as T;\n}\n\nfunction retryDelayMs(attempt: number, baseDelayMs: number, err: unknown): number {\n const cap = 30_000;\n if (err instanceof JsonRpcTransientError && err.suggestedDelayMs != null) {\n return Math.min(cap, err.suggestedDelayMs);\n }\n return Math.min(cap, baseDelayMs * 2 ** attempt);\n}\n\nexport type JsonRpcThrottle = <T>(fn: () => Promise<T>) => Promise<T>;\n\n/**\n * JSON-RPC call with throttling + exponential backoff on {@link JsonRpcTransientError}.\n */\nexport async function jsonRpcFetchWithRetries<T>(\n throttle: JsonRpcThrottle,\n rpcUrl: string,\n method: string,\n params: unknown[],\n maxAttempts: number,\n baseDelayMs: number\n): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await throttle(() => jsonRpcFetchOnce<T>(rpcUrl, method, params));\n } catch (e) {\n lastErr = e;\n const retryable = e instanceof JsonRpcTransientError;\n if (!retryable || attempt === maxAttempts - 1) break;\n await sleep(retryDelayMs(attempt, baseDelayMs, e));\n }\n }\n throw lastErr;\n}\n\nexport type JsonRpcCall = <T>(method: string, params: unknown[]) => Promise<T>;\n","// `Wallet` is absent from Anchor's browser bundle (gated behind `!isBrowser`),\n// so a named import breaks strict ESM bundlers consuming this module in a\n// frontend. Access it lazily through the namespace instead — the Keypair\n// wrapping below is a Node/script-only path.\nimport * as anchor from \"@anchor-lang/core\";\nimport { AnchorProvider, type Wallet } from \"@anchor-lang/core\";\nimport { Connection, type ConfirmOptions, Keypair } from \"@solana/web3.js\";\nimport type { Environment } from \"../types\";\nimport { getRpcUrl } from \"./rpc\";\n\nconst DEFAULT_COMMITMENT = \"confirmed\" as const;\n\n/**\n * Builds an {@link AnchorProvider} for the given cluster with the standard script defaults\n * (`Connection` + `opts` use the same commitment, default `\"confirmed\"`).\n *\n * @param walletOrKeypair - Anchor `Wallet`, or a `@solana/web3.js` `Keypair` (wrapped as `Wallet`).\n */\nexport function createDefaultAnchorProvider(\n env: Environment,\n walletOrKeypair: Wallet | Keypair,\n confirmOptions?: ConfirmOptions\n): AnchorProvider {\n const commitment = confirmOptions?.commitment ?? DEFAULT_COMMITMENT;\n const wallet =\n walletOrKeypair instanceof Keypair ? new anchor.Wallet(walletOrKeypair) : walletOrKeypair;\n const opts: ConfirmOptions = { commitment, ...confirmOptions };\n\n return new AnchorProvider(new Connection(getRpcUrl(env), commitment), wallet, opts);\n}\n\n/**\n * Builds a read-only {@link AnchorProvider} with a throwaway keypair.\n *\n * Use this for services that only need to read on-chain state (e.g. the\n * price ingestion Lambda) and never sign transactions.\n */\nexport function createReadOnlyAnchorProvider(env: Environment): AnchorProvider {\n return createDefaultAnchorProvider(env, Keypair.generate());\n}\n","import type {\n Address,\n Base64EncodedWireTransaction,\n Blockhash,\n CompilableTransactionMessage,\n Instruction,\n Rpc,\n SolanaRpcApi,\n TransactionSigner,\n Signature,\n SignatureBytes,\n Transaction,\n} from \"@solana/kit\";\nimport {\n pipe,\n createTransactionMessage,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstructions,\n compressTransactionMessageUsingAddressLookupTables,\n compileTransaction,\n signTransactionMessageWithSigners,\n getSignatureFromTransaction,\n getBase64EncodedWireTransaction,\n setTransactionMessageFeePayerSigner,\n addSignersToTransactionMessage,\n assertIsFullySignedTransaction,\n isTransactionModifyingSigner,\n isTransactionPartialSigner,\n} from \"@solana/kit\";\nimport { setComputeUnitLimitIx, setComputeUnitPriceIx } from \"./instruction\";\nimport { lutManager } from \"../services/lutManager\";\nimport { deduplicateAccounts } from \"./general\";\nimport { DEFAULT_PUBLIC_KEY } from \"../constants\";\nimport {\n getRandomTipAccount,\n buildTipInstruction,\n sendBundle,\n simulateBundle,\n confirmBundle,\n DEFAULT_JITO_TIP_LAMPORTS,\n JitoBundleError,\n BUNDLE_INJECTED_IX_RESERVED_BYTES,\n} from \"./jito\";\nimport { jsonRpcFetchOnce } from \"./jsonRpcFetch\";\nimport { isTransientNetworkError } from \"./retry\";\nimport { getMainnetRpcUrl, redactRpcUrlForLog } from \"./rpc\";\nimport { getPriorityFeeEstimate, PriorityFeeSetting } from \"./priorityFee\";\nimport {\n splitIntoTransactionBins,\n measureTxBytes,\n SOLANA_TX_SIZE_LIMIT,\n} from \"./transactionSplitter\";\n\nconst MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n\n/** Default headroom over simulated CU usage for typical operator transactions. */\nexport const DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER = 1.1;\n\n/**\n * Headroom for txs with deep CPI stacks (Jupiter + external liquidity mint/deposit).\n * Simulation often undershoots on-chain usage by more than 10%.\n */\nexport const HEAVY_CPI_COMPUTE_UNIT_LIMIT_MULTIPLIER = 1.2;\n\nexport function computeUnitLimitFromSimulation(\n unitsConsumed: number,\n multiplier: number = DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER\n): number {\n if (!(unitsConsumed > 0) || !(multiplier > 0)) {\n return MAX_COMPUTE_UNIT_LIMIT;\n }\n return Math.min(MAX_COMPUTE_UNIT_LIMIT, Math.ceil(unitsConsumed * multiplier));\n}\n\n/** Distinct writable account addresses across `instructions`. */\nfunction collectWritableAccounts(instructions: Instruction[]): Address[] {\n const seen = new Set<string>();\n const out: Address[] = [];\n for (const ix of instructions) {\n for (const acc of ix.accounts ?? []) {\n // Account flags: 1 = writable in Kit's `IAccountMeta` (signer is bit 0).\n const role = (acc as { role?: number }).role;\n if (role != null && (role & 1) === 1) {\n const addr = (acc as { address: Address }).address;\n if (!seen.has(addr as unknown as string)) {\n seen.add(addr as unknown as string);\n out.push(addr);\n }\n }\n }\n }\n return out;\n}\n\ntype SignatureDictionary = Record<Address, SignatureBytes>;\n\nasync function signTransactionsWithSigners(\n transactions: readonly Transaction[],\n signers: readonly TransactionSigner[]\n): Promise<Transaction[]> {\n let signedTransactions = [...transactions];\n const modifyingSigners = signers.filter(isTransactionModifyingSigner);\n const partialSigners = signers.filter(isTransactionPartialSigner);\n\n for (const signer of modifyingSigners) {\n signedTransactions = [...(await signer.modifyAndSignTransactions(signedTransactions))];\n }\n\n for (const signer of partialSigners) {\n const signatures = await signer.signTransactions(signedTransactions);\n signedTransactions = signedTransactions.map((transaction, index) => ({\n ...transaction,\n signatures: {\n ...transaction.signatures,\n ...(signatures[index] as SignatureDictionary),\n },\n }));\n }\n\n for (const transaction of signedTransactions) {\n assertIsFullySignedTransaction(transaction);\n }\n\n return signedTransactions;\n}\n\n/**\n * Error thrown when a transaction simulation or on-chain execution fails.\n * Carries the raw Solana program logs so callers (e.g. NestJS services)\n * can log them through their own structured logger instead of dumping\n * to stdout via `console.error`.\n */\nexport class TransactionError extends Error {\n readonly programLogs: string[];\n\n constructor(message: string, programLogs: string[] = []) {\n super(programLogs.length ? `${message}\\n\\nProgram logs:\\n${programLogs.join(\"\\n\")}` : message);\n this.name = \"TransactionError\";\n this.programLogs = programLogs;\n }\n}\n\nfunction logProgramLogsLineByLine(logs: string[], label = \"Program logs\") {\n if (!logs.length) {\n console.error(`${label}: (no logs returned)`);\n return;\n }\n console.error(`${label} (${logs.length} lines):`);\n logs.forEach((line, index) => {\n console.error(`[${index}] ${line}`);\n });\n}\n\ntype BlockhashResponse = {\n value: Readonly<{ blockhash: Blockhash; lastValidBlockHeight: bigint }>;\n};\n\n/**\n * Options for signSendAndConfirmTransaction.\n */\nexport interface SendTransactionOptions {\n /** Address lookup tables for transaction compression */\n lookupTables?: Address[];\n /** Additional signers beyond the fee payer (e.g., mint authority) */\n additionalSigners?: TransactionSigner[];\n /** Whether or not to print transaction logs after a simulation or transaction failure */\n hideFailureInfo?: boolean;\n /**\n * Jito tip in lamports for bundle submissions. Default: 10,000.\n * Set to 0 to disable bundle fallback (throws on oversize instead).\n */\n jitoTipLamports?: number;\n /**\n * Force the Jito bundle path even when the transaction fits in a single tx.\n * Useful for smoke-testing bundle submission on mainnet. Requires\n * `jitoTipLamports` > 0 unless {@link sendOversizedAsSequentialTransactions}\n * is set.\n */\n forceJitoBundle?: boolean;\n /**\n * When the oversize path runs, send each split transaction with normal\n * `sendTransaction` + confirmation instead of a Jito bundle. For Surfpool,\n * local validators, and other RPCs that do not implement `sendBundle`.\n *\n * Not atomic: ledger state may change between sub-transactions. Does not\n * add a Jito tip (`jitoTipLamports` is ignored). Uses a fresh blockhash per\n * sub-transaction so earlier confirmations cannot expire the next send.\n */\n sendOversizedAsSequentialTransactions?: boolean;\n /**\n * Override the estimated compute-unit price (in micro-lamports). When set,\n * skips priority-fee estimation and uses this value directly.\n */\n computeUnitPriceMicroLamports?: number;\n /**\n * Helius-compatible priority level requested through the configured RPC.\n * Explicit `computeUnitPriceMicroLamports` takes precedence. When both\n * options are omitted, no compute-unit-price instruction is added.\n */\n priorityFeeSetting?: PriorityFeeSetting;\n /**\n * Multiplier applied to simulated `unitsConsumed` when setting the compute\n * unit limit. Defaults to {@link DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER}.\n */\n computeUnitLimitMultiplier?: number;\n}\n\nasync function resolvePriorityFeeMicroLamports(\n rpc: Rpc<SolanaRpcApi>,\n transactionMessage: CompilableTransactionMessage,\n writableAccounts: Address[],\n options: SendTransactionOptions | undefined\n): Promise<number | undefined> {\n if (options?.computeUnitPriceMicroLamports !== undefined) {\n return options.computeUnitPriceMicroLamports;\n }\n\n if (options?.priorityFeeSetting === undefined) {\n return undefined;\n }\n\n const estimateMessage = appendTransactionMessageInstructions(\n [setComputeUnitLimitIx(MAX_COMPUTE_UNIT_LIMIT)],\n transactionMessage\n ) as CompilableTransactionMessage;\n const estimateTransaction = getBase64EncodedWireTransaction(compileTransaction(estimateMessage));\n return getPriorityFeeEstimate(\n rpc,\n estimateTransaction,\n writableAccounts,\n options.priorityFeeSetting\n );\n}\n\nfunction getComputeBudgetInstructions(\n computeUnitLimit: number,\n priorityFeeMicroLamports: number | undefined\n): Instruction[] {\n return priorityFeeMicroLamports === undefined\n ? [setComputeUnitLimitIx(computeUnitLimit)]\n : [setComputeUnitPriceIx(priorityFeeMicroLamports), setComputeUnitLimitIx(computeUnitLimit)];\n}\n\nexport interface TransactionPlan {\n instructions: Instruction[];\n lookupTables?: Address[];\n /**\n * Partition of `instructions` into indivisible segments when splitting for\n * wire size (Jito bundle or sequential oversize). Lengths must be positive\n * and sum to `instructions.length`. Omitted or undefined: each instruction\n * is its own segment (legacy `Instruction[]` behavior).\n *\n * Example: [1, 2, 3] means the first 1 instruction is in the first bin, the\n * next 2 are in the second bin, and the last 3 are in the third bin.\n *\n * Use this to keep an atomic group together — e.g. a Kamino flash\n * borrow/rebalance/repay triple, where the borrow's `flash_ixs.rs` check\n * introspects its own tx's instructions sysvar to find the matching repay.\n */\n segmentLengths?: number[];\n /**\n * Indices into the segments produced by `segmentLengths` that must\n * always start a fresh bin. The current bin (if any) is flushed before\n * the segment is appended, regardless of whether it would have fit.\n *\n * Use this when a CPI in the segment encodes a position-relative index at\n * build time (e.g. Kamino's flash-borrow records the position of the\n * matching repay in its data) — forcing the segment to start a new bin\n * keeps that index stable across runs.\n */\n freshBinSegments?: number[];\n}\n\nexport type SendTransactionOptionsWithPostSuccess = SendTransactionOptions & {\n onSuccess?: () => void;\n};\n\n/**\n * Build a transaction message from instructions with embedded signers.\n *\n * @param rpc - Solana RPC client\n * @param feePayer - Fee payer with TransactionSigner (signer will be embedded)\n * @param instructions - Instructions to include\n * @param lookupTableAddresses - Optional lookup tables for compression\n * @param additionalSigners - Optional additional signers beyond fee payer\n * @param blockhash - Optional blockhash (fetched if not provided)\n */\nexport async function buildTransactionMessage(\n rpc: Rpc<SolanaRpcApi>,\n feePayer: TransactionSigner,\n instructions: Instruction[],\n lookupTableAddresses?: Address[],\n additionalSigners?: TransactionSigner[],\n blockhash?: Readonly<{ blockhash: Blockhash; lastValidBlockHeight: bigint }>\n): Promise<CompilableTransactionMessage> {\n const blockhashInfo =\n blockhash ??\n ((await rpc.getLatestBlockhash({ commitment: \"confirmed\" }).send()) as BlockhashResponse).value;\n\n let transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n (tx) => setTransactionMessageFeePayerSigner(feePayer, tx),\n (tx) => setTransactionMessageLifetimeUsingBlockhash(blockhashInfo, tx),\n (tx) => appendTransactionMessageInstructions(instructions, tx)\n );\n\n // Attach all signers (fee payer + additional) to instruction accounts that need them\n const allSigners = [feePayer, ...(additionalSigners ?? [])];\n transactionMessage = addSignersToTransactionMessage(allSigners, transactionMessage);\n\n if (lookupTableAddresses?.length) {\n const lutInputs = await lutManager.getLookupTableInputs(\n rpc,\n deduplicateAccounts(lookupTableAddresses)\n );\n const lookupTables: { [key: Address]: Address[] } = {};\n for (const lut of lutInputs) {\n lookupTables[lut.address] = [...lut.addresses];\n }\n transactionMessage = compressTransactionMessageUsingAddressLookupTables(\n transactionMessage,\n lookupTables\n );\n }\n\n return transactionMessage;\n}\n\nexport interface SimulationResult {\n err: object | null;\n logs: string[];\n unitsConsumed: bigint;\n}\n\n/**\n * Simulate a transaction message without requiring real signatures.\n *\n * Compiles the message into a wire-format transaction (with placeholder\n * signatures), sends it to `simulateTransaction` with signature verification\n * disabled, and validates the same recent blockhash that will be signed and\n * sent if simulation succeeds.\n *\n * @param rpc - Solana RPC client\n * @param transactionMessage - A compilable transaction message (with embedded signers)\n */\nexport async function simulateTransaction(\n rpc: Rpc<SolanaRpcApi>,\n transactionMessage: CompilableTransactionMessage\n): Promise<SimulationResult> {\n const compiledTransaction = compileTransaction(transactionMessage);\n const base64EncodedTransaction = getBase64EncodedWireTransaction(compiledTransaction);\n\n const {\n value: { err, logs, unitsConsumed },\n } = await rpc\n .simulateTransaction(base64EncodedTransaction, {\n encoding: \"base64\",\n sigVerify: false,\n replaceRecentBlockhash: false,\n commitment: \"confirmed\",\n })\n .send();\n\n return {\n err: err as object | null,\n logs: logs ?? [],\n unitsConsumed: unitsConsumed ?? 0n,\n };\n}\n\n/**\n * Build, sign, send, and confirm a transaction using embedded signers.\n *\n * Use this with instructions that have TransactionSigner objects embedded\n * in their accounts.\n *\n * @param rpc - Solana RPC client\n * @param payer - Fee payer with TransactionSigner\n * @param instructionsOrPlan - Kit Instructions or a composed transaction plan\n * (with embedded signers)\n * @param options - Optional configuration\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * const sig = await signSendAndConfirmTransaction(rpc, payer, [\n * computeBudgetIx,\n * transferIx,\n * ]);\n * ```\n */\nexport async function signSendAndConfirmTransaction(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n instructionsOrPlan: Instruction[] | TransactionPlan,\n options?: SendTransactionOptionsWithPostSuccess\n): Promise<Signature> {\n const instructions = Array.isArray(instructionsOrPlan)\n ? instructionsOrPlan\n : instructionsOrPlan.instructions;\n const lookupTables = Array.isArray(instructionsOrPlan)\n ? options?.lookupTables\n : (options?.lookupTables ?? instructionsOrPlan.lookupTables);\n const segmentLengths = Array.isArray(instructionsOrPlan)\n ? undefined\n : instructionsOrPlan.segmentLengths;\n const freshBinSegments = Array.isArray(instructionsOrPlan)\n ? undefined\n : instructionsOrPlan.freshBinSegments;\n\n const filteredLuts = lookupTables?.filter((x) => x !== DEFAULT_PUBLIC_KEY);\n\n // Build transaction message with embedded signers\n const transactionMessage = await buildTransactionMessage(\n rpc,\n payer,\n instructions,\n filteredLuts,\n options?.additionalSigners\n );\n\n // Reserve room for compute-budget instructions added after this measurement.\n // Also route to the split path whenever the plan declares\n // `freshBinSegments`, since those boundaries only take effect there.\n const txBytes = measureTxBytes(transactionMessage);\n const maxUnaugmentedTxBytes = SOLANA_TX_SIZE_LIMIT - BUNDLE_INJECTED_IX_RESERVED_BYTES;\n const mustSplit =\n txBytes > maxUnaugmentedTxBytes || options?.forceJitoBundle || !!freshBinSegments?.length;\n if (mustSplit) {\n if (options?.sendOversizedAsSequentialTransactions) {\n return signSendAndConfirmSplitSequentially(\n rpc,\n payer,\n instructions,\n filteredLuts,\n options,\n segmentLengths,\n freshBinSegments\n );\n }\n return _signSendAndConfirmBundle(\n rpc,\n payer,\n instructions,\n filteredLuts,\n options,\n segmentLengths,\n freshBinSegments\n );\n }\n\n // ── Single-transaction happy path ──\n\n // Resolve the caller's explicit price or provider-routed priority level. If\n // neither is provided, the transaction carries no compute-unit-price instruction.\n const writableAccounts = collectWritableAccounts(instructions);\n const priorityFeeMicroLamports = await resolvePriorityFeeMicroLamports(\n rpc,\n transactionMessage,\n writableAccounts,\n options\n );\n\n // Simulate with the max CU limit and, when requested, the chosen priority\n // fee. Matching the final compute-budget instructions keeps preflight costs\n // consistent with the on-chain transaction.\n const simMessage = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(MAX_COMPUTE_UNIT_LIMIT, priorityFeeMicroLamports),\n transactionMessage\n ) as CompilableTransactionMessage;\n const simulation = await simulateTransaction(rpc, simMessage);\n if (simulation.err) {\n if (!options?.hideFailureInfo) {\n console.error(\"Simulation failed:\", simulation.err);\n logProgramLogsLineByLine(simulation.logs, \"Simulation logs\");\n }\n const errStr = JSON.stringify(simulation.err, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n );\n throw new TransactionError(`Transaction simulation failed: ${errStr}`, simulation.logs);\n }\n\n // Append the measured CU limit (with headroom) and the optional priority fee.\n const computeUnits = computeUnitLimitFromSimulation(\n Number(simulation.unitsConsumed),\n options?.computeUnitLimitMultiplier ?? DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER\n );\n const finalMessage = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(computeUnits, priorityFeeMicroLamports),\n transactionMessage\n );\n\n // Sign with embedded signers\n const signedTx = await signTransactionMessageWithSigners(\n finalMessage as typeof transactionMessage\n );\n\n // Send transaction\n const base64EncodedTransaction = getBase64EncodedWireTransaction(signedTx);\n const signature = getSignatureFromTransaction(signedTx);\n\n await rpc\n .sendTransaction(base64EncodedTransaction, {\n encoding: \"base64\",\n skipPreflight: true,\n })\n .send();\n\n // Confirm transaction at the specified commitment level\n try {\n await confirmTransaction(rpc, signature, \"confirmed\");\n options?.onSuccess?.();\n return signature;\n } catch (error) {\n // Before declaring failure, ask the RPC for the on-chain truth. The\n // confirmation loop can fail for reasons unrelated to the tx itself\n // (timeout, upstream provider returning \"All providers failed\", etc.),\n // and in those cases the tx may have actually landed.\n let logs: string[] = [];\n let landedSuccessfully = false;\n try {\n const info = await rpc\n .getTransaction(signature, { commitment: \"confirmed\", encoding: \"base64\" })\n .send();\n if (info) {\n logs = (info.meta?.logMessages ?? []) as string[];\n if (info.meta?.err == null) {\n landedSuccessfully = true;\n }\n }\n } catch {\n // Best-effort lookup; if this also fails, we fall through and throw.\n }\n\n if (landedSuccessfully) {\n console.warn(\n `Confirmation polling failed for signature ${signature} but the transaction landed on-chain; treating as success. Reason: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n options?.onSuccess?.();\n return signature;\n }\n\n if (!options?.hideFailureInfo) {\n console.error(\"Transaction failed:\", error);\n logProgramLogsLineByLine(logs, \"Transaction logs\");\n }\n throw new TransactionError(`Transaction failed: ${error}`, logs);\n }\n}\n\n/**\n * Build and sign one split bin.\n */\nasync function signSplitBin(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n bin: Instruction[],\n lookupTables: Address[] | undefined,\n additionalSigners: TransactionSigner[] | undefined,\n blockhash: Readonly<{ blockhash: Blockhash; lastValidBlockHeight: bigint }>,\n priorityFeeMicroLamports: number | undefined\n): Promise<{ wireB64: Base64EncodedWireTransaction; signature: Signature }> {\n const msg = await buildTransactionMessage(\n rpc,\n payer,\n bin,\n lookupTables,\n additionalSigners,\n blockhash\n );\n\n const finalMsg = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(MAX_COMPUTE_UNIT_LIMIT, priorityFeeMicroLamports),\n msg\n );\n const signed = await signTransactionMessageWithSigners(finalMsg as typeof msg);\n return {\n wireB64: getBase64EncodedWireTransaction(signed),\n signature: getSignatureFromTransaction(signed),\n };\n}\n\n/**\n * Split an oversize instruction list into multiple transactions and submit\n * them atomically as a Jito bundle. If Jito is disabled (`jitoTipLamports === 0`),\n * throws instead of bundling.\n *\n * Bundle simulation runs through the RPC's `simulateBundle` (instead of a\n * per-bin `simulateTransaction`) so intra-bundle dependencies — e.g. a\n * refresh ix in bin 0 that the rebalance ix in bin 1 relies on — are honored\n * by the simulator the same way they are by atomic bundle execution. The\n * simulation skips signature verification but validates the same shared\n * blockhash that is retained for final signing.\n */\nasync function _signSendAndConfirmBundle(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n instructions: Instruction[],\n lookupTables: Address[] | undefined,\n options?: SendTransactionOptionsWithPostSuccess,\n segmentLengths?: number[],\n freshBinSegments?: number[]\n): Promise<Signature> {\n const tipLamports = options?.jitoTipLamports ?? DEFAULT_JITO_TIP_LAMPORTS;\n\n if (tipLamports === 0) {\n throw new TransactionError(\n \"Transaction exceeds the Solana size limit and Jito bundling is disabled. \" +\n \"Set jitoTipLamports > 0 to enable bundle fallback.\"\n );\n }\n\n // Fetch one blockhash and reuse it for every tx in the bundle. This\n // avoids redundant RPC calls during splitting + per-bin build, and\n // ensures the whole bundle shares a single liveness window.\n const { value: blockhash } = (await rpc\n .getLatestBlockhash({ commitment: \"confirmed\" })\n .send()) as BlockhashResponse;\n\n // Split instructions, reserving headroom for the compute-unit-limit ix\n // that gets appended to every bin and the Jito tip ix that gets appended\n // to one bin. Without reservation, a near-full bin would overflow 1232\n // bytes once those are injected.\n const { bins } = await splitIntoTransactionBins(rpc, payer, instructions, {\n lookupTables,\n additionalSigners: options?.additionalSigners,\n blockhash,\n reservedBytes: BUNDLE_INJECTED_IX_RESERVED_BYTES,\n segmentLengths,\n freshBinSegments,\n });\n\n if (bins.length === 0) {\n throw new TransactionError(\"Bundle build produced 0 bins; cannot attach Jito tip.\");\n }\n // Build each bin's transaction message once; we'll reuse it for both the\n // pre-signing simulation and the final signing pass.\n const messages: CompilableTransactionMessage[] = [];\n for (const bin of bins) {\n messages.push(\n await buildTransactionMessage(\n rpc,\n payer,\n bin,\n lookupTables,\n options?.additionalSigners,\n blockhash\n )\n );\n }\n\n // Append the Jito tip ix AFTER LUT compression in `buildTransactionMessage`.\n // If we appended it before compression and any supplied LUT contained the\n // tip account, it would be moved into the LUT-loaded address set. Jito's\n // bundle validator only inspects *static* account keys for tip accounts and\n // rejects with \"Bundles must write lock at least one tip account to be\n // eligible for the auction\" otherwise.\n //\n // Pick the smallest tx to carry the tip so a bin already near the 1232-byte\n // wire limit isn't pushed over by the extra ~81 bytes of tip-transfer ix.\n const tipBinIdx = messages\n .map((m, i) => ({ i, bytes: measureTxBytes(m) }))\n .reduce((a, b) => (a.bytes <= b.bytes ? a : b)).i;\n const tipAccount = getRandomTipAccount();\n const tipIx = buildTipInstruction(payer, tipAccount, tipLamports);\n messages[tipBinIdx] = appendTransactionMessageInstructions(\n [tipIx],\n messages[tipBinIdx]\n ) as CompilableTransactionMessage;\n console.log(\n `[bundle] attached ${tipLamports} lamport tip to tx[${tipBinIdx}] (smallest of ${messages.length}) → ${tipAccount}`\n );\n\n const priorityFeeMicroLamports = await Promise.all(\n messages.map((message, index) =>\n resolvePriorityFeeMicroLamports(rpc, message, collectWritableAccounts(bins[index]), options)\n )\n );\n\n // Phase 1: encode each bin with a max CU limit and run a single bundle-level\n // simulation. `compileTransaction` stamps placeholder signatures, while\n // `skipSigVerify` lets the simulator validate the real shared blockhash\n // before the wallet signs.\n const simEncodedTxs: string[] = [];\n for (let i = 0; i < messages.length; i += 1) {\n const simMsg = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(MAX_COMPUTE_UNIT_LIMIT, priorityFeeMicroLamports[i]),\n messages[i]\n ) as CompilableTransactionMessage;\n const compiled = compileTransaction(simMsg);\n simEncodedTxs.push(getBase64EncodedWireTransaction(compiled));\n }\n\n const rpcUrl = getMainnetRpcUrl();\n const simResult = await simulateBundle(rpcUrl, simEncodedTxs, {\n replaceRecentBlockhash: false,\n });\n const failingIdx = simResult.transactionResults.findIndex((r) => r.err != null);\n if (simResult.summary !== \"succeeded\" || failingIdx >= 0) {\n const idx = failingIdx >= 0 ? failingIdx : 0;\n const failed = simResult.transactionResults[idx];\n if (!options?.hideFailureInfo) {\n console.error(`Bundle simulation failed at tx[${idx}] of ${bins.length}.`);\n console.error(\"Summary:\", JSON.stringify(simResult.summary, null, 2));\n simResult.transactionResults.forEach((r, i) => {\n const tag = i === idx ? \" ← FAILED\" : i < idx ? \" (succeeded)\" : \" (not run)\";\n console.error(`\\n── tx[${i}]${tag} (unitsConsumed=${r.unitsConsumed ?? \"—\"}) ──`);\n if (r.err != null) console.error(\" err:\", JSON.stringify(r.err));\n logProgramLogsLineByLine(r.logs ?? [], `tx[${i}] bundle simulation logs`);\n });\n\n // Fall back to a single-tx `simulateTransaction` on the failing bin —\n // it returns longer logs than `simulateBundle` (which truncates at\n // ~16 lines). Skips the intra-bundle effects from preceding bins, so\n // dependent failures (e.g. PriceIsStale when bin 0 was supposed to\n // refresh) surface here instead. Best-effort; we keep the original\n // error.\n //\n // Uses direct JSON-RPC instead of Kit's typed `rpc.simulateTransaction`\n // wrapper because the latter has thrown \"Do not know how to serialize\n // a BigInt\" on this code path — the raw fetch route gives us a\n // bigint-safe replacer in `jsonRpcFetchOnce`'s body builder.\n try {\n const failedSimMsg = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(MAX_COMPUTE_UNIT_LIMIT, priorityFeeMicroLamports[idx]),\n messages[idx]\n ) as CompilableTransactionMessage;\n const failedB64 = getBase64EncodedWireTransaction(compileTransaction(failedSimMsg));\n const standalone = await jsonRpcFetchOnce<{\n value: { err: object | null; logs: string[] | null };\n }>(rpcUrl, \"simulateTransaction\", [\n failedB64,\n {\n encoding: \"base64\",\n sigVerify: false,\n replaceRecentBlockhash: false,\n commitment: \"confirmed\",\n },\n ]);\n console.error(\n `\\n── tx[${idx}] standalone simulateTransaction (full logs, no preceding-bin effects) ──`\n );\n if (standalone.value.err != null)\n console.error(\n \" err:\",\n JSON.stringify(standalone.value.err, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n )\n );\n const logs = standalone.value.logs ?? [];\n logProgramLogsLineByLine(logs, `tx[${idx}] standalone simulation logs`);\n } catch (err) {\n console.error(\n \" (standalone fallback failed:\",\n err instanceof Error ? err.message : String(err),\n \")\"\n );\n }\n }\n const errStr = JSON.stringify(failed?.err ?? simResult.summary, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n );\n throw new TransactionError(\n `Bundle simulation failed at tx[${idx}]: ${errStr}`,\n failed?.logs ?? []\n );\n }\n\n // Phase 2: stamp each bin with its measured CU + 10% headroom while retaining\n // the blockhash validated by simulation, then compile and batch-sign them.\n // Browser wallets expose\n // `signTransactions`, and using it here preserves the intended multi-tx\n // approval flow for bundles instead of requesting one signature at a time.\n // Fall back to MAX_COMPUTE_UNIT_LIMIT if the simulator didn't report a\n // unitsConsumed value (some endpoints omit it on edge cases).\n const finalTransactions: Transaction[] = [];\n for (let i = 0; i < messages.length; i += 1) {\n const measured = simResult.transactionResults[i]?.unitsConsumed;\n const cu = measured && measured > 0 ? Math.ceil(measured * 1.1) : MAX_COMPUTE_UNIT_LIMIT;\n const withCu = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(cu, priorityFeeMicroLamports[i]),\n messages[i]\n ) as CompilableTransactionMessage;\n const finalMsg = setTransactionMessageLifetimeUsingBlockhash(\n blockhash,\n withCu\n ) as CompilableTransactionMessage;\n finalTransactions.push(compileTransaction(finalMsg));\n }\n const signedTransactions = await signTransactionsWithSigners(finalTransactions, [\n payer,\n ...(options?.additionalSigners ?? []),\n ]);\n const base64Txs = signedTransactions.map(getBase64EncodedWireTransaction);\n const lastSignature = getSignatureFromTransaction(\n signedTransactions[signedTransactions.length - 1]\n );\n\n // Submit and confirm the bundle through the user's own RPC endpoint\n // (Helius, Ironforge, etc.). These providers proxy Jito bundle methods,\n // avoiding the global rate limit on Jito's public block engine.\n try {\n console.log(`[bundle] sending via ${redactRpcUrlForLog(rpcUrl)}`);\n const bundleId = await sendBundle(rpcUrl, base64Txs);\n await confirmBundle(rpcUrl, bundleId);\n\n options?.onSuccess?.();\n\n // Last bin carries the tip; signature matches what landed on-chain.\n return lastSignature!;\n } catch (error) {\n if (error instanceof JitoBundleError) {\n throw new TransactionError(`Jito bundle failed: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Same bin-packing as {@link signSendAndConfirmBundle}, but no tip and each\n * bin is sent and confirmed via normal RPC (for environments without Jito).\n */\nasync function signSendAndConfirmSplitSequentially(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n instructions: Instruction[],\n lookupTables: Address[] | undefined,\n options?: SendTransactionOptionsWithPostSuccess,\n segmentLengths?: number[],\n freshBinSegments?: number[]\n): Promise<Signature> {\n const { value: splitBlockhash } = (await rpc\n .getLatestBlockhash({ commitment: \"confirmed\" })\n .send()) as BlockhashResponse;\n\n const { bins } = await splitIntoTransactionBins(rpc, payer, instructions, {\n lookupTables,\n additionalSigners: options?.additionalSigners,\n blockhash: splitBlockhash,\n reservedBytes: BUNDLE_INJECTED_IX_RESERVED_BYTES,\n segmentLengths,\n freshBinSegments,\n });\n\n let lastSignature: Signature | undefined;\n\n for (const [binIndex, bin] of bins.entries()) {\n const { value: blockhash } = (await rpc\n .getLatestBlockhash({ commitment: \"confirmed\" })\n .send()) as BlockhashResponse;\n\n const transactionMessage = await buildTransactionMessage(\n rpc,\n payer,\n bin,\n lookupTables,\n options?.additionalSigners,\n blockhash\n );\n const priorityFeeMicroLamports = await resolvePriorityFeeMicroLamports(\n rpc,\n transactionMessage,\n collectWritableAccounts(bin),\n options\n );\n const simMsg = appendTransactionMessageInstructions(\n getComputeBudgetInstructions(MAX_COMPUTE_UNIT_LIMIT, priorityFeeMicroLamports),\n transactionMessage\n ) as CompilableTransactionMessage;\n const simulation = await simulateTransaction(rpc, simMsg);\n if (simulation.err) {\n if (!options?.hideFailureInfo) {\n console.error(`Simulation failed for split bin ${binIndex}:`, simulation.err);\n logProgramLogsLineByLine(simulation.logs, `split bin ${binIndex} simulation logs`);\n }\n const errStr = JSON.stringify(simulation.err, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n );\n throw new TransactionError(\n `Split bin ${binIndex} simulation failed: ${errStr}`,\n simulation.logs\n );\n }\n\n const { wireB64, signature } = await signSplitBin(\n rpc,\n payer,\n bin,\n lookupTables,\n options?.additionalSigners,\n blockhash,\n priorityFeeMicroLamports\n );\n\n await rpc\n .sendTransaction(wireB64, {\n encoding: \"base64\",\n skipPreflight: true,\n })\n .send();\n\n try {\n await confirmTransaction(rpc, signature, \"confirmed\");\n } catch (error) {\n const logs = await fetchTransactionLogsWithRetry(rpc, signature);\n if (!options?.hideFailureInfo) {\n console.error(`Transaction failed for split bin ${binIndex}:`, signature, error);\n logProgramLogsLineByLine(logs, `split bin ${binIndex} transaction logs`);\n }\n throw new TransactionError(`Transaction failed: ${error}`, logs);\n }\n\n lastSignature = signature;\n }\n\n options?.onSuccess?.();\n return lastSignature!;\n}\n\nasync function fetchTransactionLogsWithRetry(\n rpc: Rpc<SolanaRpcApi>,\n signature: Signature\n): Promise<string[]> {\n for (let attempt = 0; attempt < 10; attempt += 1) {\n try {\n const info = await rpc\n .getTransaction(signature, { commitment: \"confirmed\", encoding: \"base64\" })\n .send();\n const logs = (info?.meta?.logMessages ?? []) as string[];\n if (logs.length > 0) return logs;\n } catch {\n // Best-effort log retrieval; retry below.\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n return [];\n}\n\n/**\n * Wait for a transaction to be confirmed at the specified commitment level.\n *\n * @param rpc - Solana RPC client\n * @param signature - Transaction signature to confirm\n * @param commitment - Commitment level to wait for\n * @param timeoutMs - Maximum time to wait (default: 60000ms)\n */\nasync function confirmTransaction(\n rpc: Rpc<SolanaRpcApi>,\n signature: Signature,\n commitment: \"processed\" | \"confirmed\" | \"finalized\",\n timeoutMs: number = 60000\n): Promise<void> {\n const startTime = Date.now();\n const pollIntervalMs = 500;\n\n while (Date.now() - startTime < timeoutMs) {\n let status: Awaited<\n ReturnType<ReturnType<Rpc<SolanaRpcApi>[\"getSignatureStatuses\"]>[\"send\"]>\n >[\"value\"][number] = null;\n try {\n const response = await rpc.getSignatureStatuses([signature]).send();\n status = response.value[0];\n } catch (err) {\n // Transient upstream RPC failures during confirmation polling (e.g.\n // Ironforge returning \"All providers failed\", DNS hiccups, 429s) must\n // not declare the transaction failed — the tx may already have landed.\n // Keep polling until we get a real status or the timeout elapses.\n if (!isTransientNetworkError(err)) throw err;\n }\n\n if (status !== null) {\n // Check if transaction failed\n if (status.err) {\n // Use replacer to handle BigInt values in error objects\n const errStr = JSON.stringify(status.err, (_, v) =>\n typeof v === \"bigint\" ? v.toString() : v\n );\n throw new Error(`Transaction failed: ${errStr}`);\n }\n\n // Check if we've reached the desired commitment level\n const confirmationStatus = status.confirmationStatus;\n if (\n confirmationStatus === commitment ||\n (commitment === \"processed\" && confirmationStatus) ||\n (commitment === \"confirmed\" &&\n (confirmationStatus === \"confirmed\" || confirmationStatus === \"finalized\")) ||\n (commitment === \"finalized\" && confirmationStatus === \"finalized\")\n ) {\n return;\n }\n }\n\n // Wait before polling again\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n throw new Error(`Transaction confirmation timeout after ${timeoutMs}ms`);\n}\n","import type {\n Address,\n ProgramDerivedAddress,\n Rpc,\n SolanaRpcApi,\n TransactionSigner,\n} from \"@solana/kit\";\nimport { getProgramDerivedAddress, getAddressEncoder, getU64Encoder } from \"@solana/kit\";\nimport {\n getCreateLookupTableInstruction,\n getExtendLookupTableInstruction,\n fetchAddressLookupTable,\n ADDRESS_LOOKUP_TABLE_PROGRAM_ADDRESS,\n} from \"@solana-program/address-lookup-table\";\nimport {\n TransactionError,\n deduplicateAccounts,\n getBatches,\n getSlot,\n signSendAndConfirmTransaction,\n} from \"../utils\";\nimport { DataCache, type CacheTtlConfig } from \"./dataCache\";\nimport { DEFAULT_PUBLIC_KEY } from \"../constants\";\n\nexport type LookupTableInput = {\n address: Address;\n addresses: Address[];\n};\n\nconst LUT_CACHE_CATEGORY = \"lookupTable\";\n\nexport class LutManager {\n private cache: DataCache;\n\n constructor(cacheTtlConfig?: CacheTtlConfig) {\n this.cache = new DataCache({\n defaultTtlMs: cacheTtlConfig?.defaultTtlMs ?? 60_000 * 15,\n categoryTtlMs: cacheTtlConfig?.categoryTtlMs,\n });\n }\n\n /**\n * Fetch a single lookup table's data, with caching.\n */\n private async fetchLookupTable(\n rpc: Rpc<SolanaRpcApi>,\n address: Address\n ): Promise<LookupTableInput> {\n const { data } = await this.cache.getDataOrThrow<LookupTableInput>(\n async () => {\n const table = await fetchAddressLookupTable(rpc, address);\n return {\n address,\n addresses: table.data.addresses,\n };\n },\n LUT_CACHE_CATEGORY,\n address\n );\n return data;\n }\n\n /**\n * Fetch address lookup table data for the given addresses, with caching.\n */\n async getLookupTableInputs(\n rpc: Rpc<SolanaRpcApi>,\n lookupTableAddresses: Address[]\n ): Promise<LookupTableInput[]> {\n return Promise.all(lookupTableAddresses.map((address) => this.fetchLookupTable(rpc, address)));\n }\n\n private async addAddressesIfNeeded(\n signer: TransactionSigner,\n rpc: Rpc<SolanaRpcApi>,\n lookupTableAddress: Address,\n existingAddresses: Address[],\n addressesToAdd: Address[]\n ) {\n const existingSet = new Set(existingAddresses);\n const addresses = addressesToAdd.filter((x) => !existingSet.has(x));\n\n if (addresses.length > 0) {\n const batches = getBatches(addresses, 20);\n for (const addressBatch of batches) {\n const extendIx = getExtendLookupTableInstruction({\n address: lookupTableAddress,\n authority: signer,\n payer: signer,\n addresses: addressBatch,\n });\n await signSendAndConfirmTransaction(rpc, signer, [extendIx]);\n }\n }\n }\n\n private async deriveLookupTableAddress(\n signerAddress: Address,\n recentSlot: bigint\n ): Promise<ProgramDerivedAddress> {\n const addressEncoder = getAddressEncoder();\n const u64Encoder = getU64Encoder();\n\n return await getProgramDerivedAddress({\n programAddress: ADDRESS_LOOKUP_TABLE_PROGRAM_ADDRESS,\n seeds: [addressEncoder.encode(signerAddress), u64Encoder.encode(recentSlot)],\n });\n }\n\n async updateLookupTable(\n signer: TransactionSigner,\n rpc: Rpc<SolanaRpcApi>,\n accounts: Address[],\n existingLookupTableAddress?: Address\n ): Promise<Address> {\n if (existingLookupTableAddress === DEFAULT_PUBLIC_KEY) {\n existingLookupTableAddress = undefined;\n }\n\n let lookupTableAddress: Address;\n let existingAccounts: Address[];\n\n if (existingLookupTableAddress) {\n lookupTableAddress = existingLookupTableAddress;\n const lutInput = await this.fetchLookupTable(rpc, lookupTableAddress);\n existingAccounts = lutInput.addresses;\n } else {\n const maxAttempts = 3;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n // CreateLookupTable requires recentSlot to be in the SlotHashes sysvar. A\n // confirmed slot can be forked out and never land there; finalized is\n // guaranteed rooted and still well within the 512-slot window.\n const slot = await getSlot(rpc, \"finalized\");\n const lutPda = await this.deriveLookupTableAddress(signer.address, slot);\n\n const createLutIx = getCreateLookupTableInstruction({\n address: lutPda,\n authority: signer,\n recentSlot: slot,\n });\n\n try {\n await signSendAndConfirmTransaction(rpc, signer, [createLutIx], {\n hideFailureInfo: attempt < maxAttempts,\n });\n lookupTableAddress = lutPda[0];\n console.log(`Created new lookup table: ${lookupTableAddress}`);\n this.cache.setCache(LUT_CACHE_CATEGORY, lookupTableAddress, {\n address: lookupTableAddress,\n addresses: [],\n });\n lastError = undefined;\n break;\n } catch (e) {\n lastError = e;\n const errorStr = String(e);\n const logsStr = e instanceof TransactionError ? e.programLogs.join(\"\\n\") : \"\";\n const isStaleSlot =\n errorStr.includes(\"is not a recent slot\") || logsStr.includes(\"is not a recent slot\");\n if (isStaleSlot && attempt < maxAttempts) {\n console.warn(\n `LUT creation failed (stale slot ${slot}), retrying (${attempt}/${maxAttempts})...`\n );\n await new Promise((r) => setTimeout(r, 2_000));\n continue;\n }\n throw e;\n }\n }\n\n if (lastError) throw lastError;\n lookupTableAddress = lookupTableAddress!;\n existingAccounts = [];\n }\n\n await this.addAddressesIfNeeded(\n signer,\n rpc,\n lookupTableAddress,\n existingAccounts,\n deduplicateAccounts(accounts).filter((x) => x !== DEFAULT_PUBLIC_KEY)\n );\n\n // Invalidate cache for this LUT since we just modified it\n this.clearLookupTableCache(lookupTableAddress);\n\n return lookupTableAddress;\n }\n\n /**\n * Clear all cached lookup table data.\n */\n clearCache() {\n this.cache.clearAllCache();\n }\n\n /**\n * Clear cached data for a specific lookup table.\n */\n clearLookupTableCache(address: Address) {\n this.cache.clearCacheEntry(LUT_CACHE_CATEGORY, address);\n }\n}\n\n/** Global LutManager instance for shared use across the application. */\nexport const lutManager = new LutManager();\n","import { SYSVAR_INSTRUCTIONS_ADDRESS, SYSVAR_RENT_ADDRESS } from \"@solana/sysvars\";\nimport { SYSTEM_PROGRAM_ADDRESS } from \"@solana-program/system\";\nimport { toCustomAccountMeta } from \"../utils\";\n\nexport const RENT_SYSVAR_META = toCustomAccountMeta(SYSVAR_RENT_ADDRESS);\nexport const SYSTEM_PROGRAM_META = toCustomAccountMeta(SYSTEM_PROGRAM_ADDRESS);\nexport const IX_SYSVAR_META = toCustomAccountMeta(SYSVAR_INSTRUCTIONS_ADDRESS);\n","// This file is auto-generated from the Rust CPI registry.\n// Do not edit manually. Run `cargo test -p common export_cpi_registry -- --ignored` to regenerate.\n\nexport const CpiTypes = {\n JUPITER_SWAP: 0,\n PERENA_MINT: 1,\n PERENA_BURN: 2,\n PERENA_STAKE: 3,\n PERENA_INSTANT_UNSTAKE: 4,\n PERENA_REQUEST_UNSTAKE: 5,\n PERENA_FULFILL_UNSTAKE: 6,\n K_INIT_USER_METADATA: 7,\n K_INIT_OBLIGATION: 8,\n K_INIT_USER_FARM: 9,\n K_REFRESH_RESERVE: 10,\n K_REFRESH_OBLIGATION: 11,\n K_REFRESH_USER_FARM: 12,\n K_HARVEST_REWARD: 13,\n K_REQUEST_ELEVATION_GROUP: 14,\n K_DEPOSIT: 15,\n K_WITHDRAW: 16,\n K_BORROW: 17,\n K_REPAY: 18,\n MPL_UPDATE_METADATA: 19,\n MPL_CREATE_METADATA: 20,\n} as const;\n","/**\n * Minimal Jito bundle client.\n *\n * Submits bundles via the user's own RPC endpoint rather than Jito's public\n * block engine. Premium Solana RPC providers (Helius, Ironforge, Triton, etc.)\n * proxy the Jito JSON-RPC methods (`sendBundle`, `getBundleStatuses`,\n * `simulateBundle`) through their authenticated endpoint. This avoids the\n * public Jito endpoint's global rate limit (error `-32097` / HTTP 429).\n *\n * Reference implementation: `EXAMPLE/solauto-sdk/src/utils/jitoUtils.ts`,\n * which routes the same calls through the user's Umi RPC endpoint\n * (Ironforge).\n *\n * Helius sendBundle docs: https://helius.mintlify.app/api-reference/sender/sendbundle\n */\n\nimport type { Address, Instruction, TransactionSigner } from \"@solana/kit\";\nimport { getTransferSolInstruction } from \"@solana-program/system\";\n\nimport { sleep } from \"./general\";\nimport { jsonRpcFetchOnce } from \"./jsonRpcFetch\";\n\n/** Max transactions per Jito bundle. */\nexport const MAX_BUNDLE_TRANSACTIONS = 5;\n\n/** Default tip when the caller doesn't specify one. */\nexport const DEFAULT_JITO_TIP_LAMPORTS = 2_000_000;\n\nexport class JitoBundleError extends Error {\n constructor(\n message: string,\n readonly bundleId?: string\n ) {\n super(message);\n this.name = \"JitoBundleError\";\n }\n}\n\n/**\n * Static Jito tip accounts. Hardcoded to avoid a network call to\n * `getTipAccounts` on every bundle — the list rarely changes.\n *\n * Exported so tests can lock in the canonical list against the Jito docs\n * and catch any future typo. Verify against:\n * https://docs.jito.wtf/lowlatencytxnsend/#response-example-tips\n */\nexport const JITO_TIP_ACCOUNTS: readonly Address[] = [\n \"96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5\" as Address,\n \"HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe\" as Address,\n];\n\n/**\n * Conservative upper bound (in wire bytes) for the instructions we inject\n * into each bundle tx _after_ bin-packing: a setComputeUnitLimit ix and,\n * Used by the splitter to reserve headroom so post-split injection never\n * overflows the 1232-byte transaction limit. The tip transfer is injected\n * only into the smallest bin in the bundle, which is typically far from\n * the size limit, so we don't reserve for it here.\n *\n * Breakdown (worst case, ComputeBudget program not in any LUT):\n * • ComputeBudget program key = 32 B\n * • setComputeUnitLimit ix header + 5 B data ≈ 13 B\n * • setComputeUnitPrice ix header + 9 B data ≈ 17 B\n * Rounded up to 64 B to cover compact-u16 edge cases.\n */\nexport const BUNDLE_INJECTED_IX_RESERVED_BYTES = 64;\n\n/** Pick one of the 8 Jito tip accounts at random. */\nexport function getRandomTipAccount(): Address {\n return JITO_TIP_ACCOUNTS[Math.floor(Math.random() * JITO_TIP_ACCOUNTS.length)];\n}\n\n/** Build a SOL transfer instruction to a Jito tip account. */\nexport function buildTipInstruction(\n payer: TransactionSigner,\n tipAccount: Address,\n lamports: number\n): Instruction {\n return getTransferSolInstruction({\n source: payer,\n destination: tipAccount,\n amount: BigInt(lamports),\n });\n}\n\n/**\n * Submit a bundle of base64-encoded signed transactions to Jito via the\n * caller's RPC endpoint. Returns the `bundle_id` for status polling.\n *\n * Helius expects `[base64Txs, { encoding: \"base64\" }]`; Ironforge and the\n * raw Jito block engine accept the same shape and fall back to base58 when\n * encoding is omitted. Using base64 everywhere matches the wire format we\n * already produce via `getBase64EncodedWireTransaction`.\n */\nexport async function sendBundle(rpcUrl: string, base64Txs: string[]): Promise<string> {\n if (base64Txs.length > MAX_BUNDLE_TRANSACTIONS) {\n throw new JitoBundleError(\n `Bundle has ${base64Txs.length} transactions, max is ${MAX_BUNDLE_TRANSACTIONS}`\n );\n }\n try {\n return await jsonRpcFetchOnce<string>(rpcUrl, \"sendBundle\", [\n base64Txs,\n { encoding: \"base64\" },\n ]);\n } catch (e) {\n throw new JitoBundleError(`sendBundle failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\nexport interface BundleSimulationTxResult {\n /** Tx-level error object, or null on success. */\n err: object | null;\n /** Program logs emitted during this tx (may be empty on signature-only failures). */\n logs: string[];\n /** Compute units consumed by this tx; absent if the tx errored before CU accounting. */\n unitsConsumed?: number;\n /** Tx-level return data, opaque to callers. */\n returnData?: unknown;\n}\n\nexport interface BundleSimulationResult {\n /** \"succeeded\" string when every tx passed; an object containing `failed` otherwise. */\n summary: \"succeeded\" | { failed: { error: unknown; txSignature?: string } };\n /** Per-tx outcome, in the same order as the bundle's `encodedTransactions`. */\n transactionResults: BundleSimulationTxResult[];\n}\n\n/**\n * Atomically simulate a bundle of base64-encoded transactions through the\n * caller's RPC endpoint. Mirrors the Jito BlockEngine `simulateBundle` shape,\n * which Helius/Ironforge/Triton proxy.\n *\n * Set `skipSigVerify=true` and `replaceRecentBlockhash=true` (defaults) to\n * simulate _before_ signing — the simulator stamps placeholder signatures and\n * substitutes a fresh blockhash, letting us measure per-tx compute units and\n * verify the bundle composes correctly without paying the signing round trip\n * twice.\n *\n * Unlike running `simulateTransaction` per bin, this preserves the\n * intra-bundle sequencing — a refresh ix in tx 0 is observable to tx 1 — so\n * bundles whose sub-txs depend on each other can be validated without false\n * positives from bin-isolation.\n */\nexport async function simulateBundle(\n rpcUrl: string,\n base64Txs: string[],\n options: { skipSigVerify?: boolean; replaceRecentBlockhash?: boolean } = {}\n): Promise<BundleSimulationResult> {\n const { skipSigVerify = true, replaceRecentBlockhash = true } = options;\n if (base64Txs.length > MAX_BUNDLE_TRANSACTIONS) {\n throw new JitoBundleError(\n `Bundle has ${base64Txs.length} transactions, max is ${MAX_BUNDLE_TRANSACTIONS}`\n );\n }\n try {\n // `preExecutionAccountsConfigs` and `postExecutionAccountsConfigs` are\n // required fields (one entry per tx) on Jito's BlockEngine and on\n // proxying providers (Helius). We don't read pre/post account state, so\n // each entry is left as `null`.\n const accountsConfigs = base64Txs.map(() => null);\n // Some endpoints return `{ context, value: { ... } }` (Helius) and others\n // return the result directly (raw Jito). Normalize by unwrapping `value`\n // when present.\n const raw = await jsonRpcFetchOnce<\n BundleSimulationResult | { context?: unknown; value: BundleSimulationResult }\n >(rpcUrl, \"simulateBundle\", [\n { encodedTransactions: base64Txs },\n {\n preExecutionAccountsConfigs: accountsConfigs,\n postExecutionAccountsConfigs: accountsConfigs,\n skipSigVerify,\n replaceRecentBlockhash,\n transactionEncoding: \"base64\",\n },\n ]);\n return \"value\" in raw && raw.value ? raw.value : (raw as BundleSimulationResult);\n } catch (e) {\n throw new JitoBundleError(\n `simulateBundle failed: ${e instanceof Error ? e.message : String(e)}`\n );\n }\n}\n\ninterface BundleStatusEntry {\n bundle_id: string;\n slot: number;\n confirmation_status: \"processed\" | \"confirmed\" | \"finalized\";\n /**\n * Jito encodes a Rust `Result`: `null` or `{ Ok: null }` = no failure;\n * `{ Err: ... }` = bundle failed. `{ Ok: null }` is truthy — do not treat\n * any non-null `err` as failure.\n */\n err: { Ok: null } | { Err: unknown } | null;\n}\n\n/**\n * Poll `getBundleStatuses` until the bundle confirms or fails.\n *\n * Mirrors the solauto reference: a `null` entry means Jito hasn't seen the\n * bundle yet (keep polling); only `err` with an `Err` key is a failure; a\n * `confirmation_status` of \"confirmed\" or \"finalized\" means success.\n */\nexport async function confirmBundle(\n rpcUrl: string,\n bundleId: string,\n timeoutMs: number = 60_000\n): Promise<{ slot: number }> {\n const pollIntervalMs = 1_000;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n await sleep(pollIntervalMs);\n\n let result: { value: (BundleStatusEntry | null)[] };\n try {\n result = await jsonRpcFetchOnce<{ value: (BundleStatusEntry | null)[] }>(\n rpcUrl,\n \"getBundleStatuses\",\n [[bundleId]]\n );\n } catch (e) {\n console.warn(`[Jito] getBundleStatuses error: ${e instanceof Error ? e.message : String(e)}`);\n continue;\n }\n\n const entry = result.value?.[0];\n if (!entry) continue;\n\n if (entry.err != null && \"Err\" in entry.err) {\n throw new JitoBundleError(\n `Bundle ${bundleId} failed: ${JSON.stringify(entry.err)}`,\n bundleId\n );\n }\n\n if (entry.confirmation_status === \"confirmed\" || entry.confirmation_status === \"finalized\") {\n return { slot: entry.slot };\n }\n }\n\n throw new JitoBundleError(\n `Bundle ${bundleId} confirmation timeout after ${timeoutMs}ms`,\n bundleId\n );\n}\n","import type { Address, Base64EncodedWireTransaction, Rpc, SolanaRpcApi } from \"@solana/kit\";\nimport bs58 from \"bs58\";\n\n/** Helius priority levels accepted by `getPriorityFeeEstimate`. */\nexport enum PriorityFeeSetting {\n Min = \"Min\",\n Low = \"Low\",\n Medium = \"Medium\",\n High = \"High\",\n VeryHigh = \"VeryHigh\",\n}\n\nconst MAX_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS = 100_000_000;\n\ntype HeliusPriorityFeeEstimate = {\n // Solana Kit's RPC transport deserializes integer JSON values as bigint,\n // while fractional estimates remain numbers.\n priorityFeeEstimate?: number | bigint;\n};\n\nfunction normalizeEstimate(result: HeliusPriorityFeeEstimate): number {\n const estimate = result.priorityFeeEstimate;\n if (typeof estimate === \"bigint\") {\n if (estimate < 0n) {\n throw new Error(\"Helius getPriorityFeeEstimate returned an invalid estimate\");\n }\n\n return Number(\n estimate > BigInt(MAX_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS)\n ? BigInt(MAX_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS)\n : estimate\n );\n }\n\n if (estimate === undefined || !Number.isFinite(estimate) || estimate < 0) {\n throw new Error(\"Helius getPriorityFeeEstimate returned an invalid estimate\");\n }\n\n return Math.min(Math.round(estimate), MAX_COMPUTE_UNIT_PRICE_MICRO_LAMPORTS);\n}\n\n/**\n * Estimate a compute-unit price through the configured RPC provider's\n * Helius-compatible `getPriorityFeeEstimate` method.\n *\n * Helius expects the serialized transaction in base58. If transaction-based\n * estimation is unavailable, retry with the transaction's account keys, which\n * preserves contention-aware pricing without silently dropping the requested fee.\n */\nexport async function getPriorityFeeEstimate(\n rpc: Rpc<SolanaRpcApi>,\n transaction: Base64EncodedWireTransaction,\n accountKeys: Address[],\n priorityFeeSetting: PriorityFeeSetting\n): Promise<number> {\n const transactionBase58 = bs58.encode(Buffer.from(transaction, \"base64\"));\n const priorityFeeRpc = rpc as unknown as {\n getPriorityFeeEstimate: (request: {\n transaction?: string;\n accountKeys?: Address[];\n options: { priorityLevel: PriorityFeeSetting };\n }) => { send: () => Promise<HeliusPriorityFeeEstimate> };\n };\n\n try {\n const result = await priorityFeeRpc\n .getPriorityFeeEstimate({\n transaction: transactionBase58,\n options: { priorityLevel: priorityFeeSetting },\n })\n .send();\n return normalizeEstimate(result);\n } catch {\n const result = await priorityFeeRpc\n .getPriorityFeeEstimate({\n accountKeys,\n options: { priorityLevel: priorityFeeSetting },\n })\n .send();\n return normalizeEstimate(result);\n }\n}\n","/**\n * Greedy bin-packing splitter for instruction lists that exceed the Solana\n * transaction wire limit (1232 bytes).\n *\n * Instructions are packed left-to-right (preserving caller order) into the\n * fewest bins where each bin compiles to a valid-sized transaction. The\n * result is an ordered array of instruction arrays, each of which can be\n * independently built into a v0 `TransactionMessage`.\n */\n\nimport type {\n Address,\n Blockhash,\n CompilableTransactionMessage,\n Instruction,\n Rpc,\n SolanaRpcApi,\n TransactionSigner,\n} from \"@solana/kit\";\nimport { compileTransaction, getBase64EncodedWireTransaction } from \"@solana/kit\";\n\nimport { buildTransactionMessage } from \"./transaction\";\nimport { MAX_BUNDLE_TRANSACTIONS } from \"./jito\";\n\n/**\n * Solana's maximum serialized transaction size in bytes. The base64 encoding\n * inflates this to ~1644 chars, but we measure the decoded wire bytes via\n * Kit's `compileTransaction` + `getBase64EncodedWireTransaction` and compare\n * against the decoded length.\n */\nexport const SOLANA_TX_SIZE_LIMIT = 1232;\n\n/**\n * Measure the wire size of a compilable transaction message in bytes.\n */\nexport function measureTxBytes(msg: CompilableTransactionMessage): number {\n const compiled = compileTransaction(msg);\n const b64 = getBase64EncodedWireTransaction(compiled);\n return Math.ceil((b64.length * 3) / 4);\n}\n\nexport interface SplitResult {\n /** Ordered instruction bins; each bin fits in one tx. */\n bins: Instruction[][];\n}\n\nexport interface SplitOptions {\n lookupTables?: Address[];\n additionalSigners?: TransactionSigner[];\n /**\n * Shared blockhash to use when compiling each candidate. Passing a stable\n * blockhash avoids a per-iteration `getLatestBlockhash` RPC call and keeps\n * every bin's size measurement consistent with what downstream signing\n * will actually produce.\n */\n blockhash?: Readonly<{ blockhash: Blockhash; lastValidBlockHeight: bigint }>;\n /**\n * Bytes to reserve below {@link SOLANA_TX_SIZE_LIMIT} for instructions\n * injected _after_ splitting (e.g. a compute-unit-limit ix on every bin\n * and a Jito tip ix on one bin). Default 0 means pack tight to the limit.\n */\n reservedBytes?: number;\n /**\n * When set, positive lengths must sum to `instructions.length`; each slice is\n * kept intact when packing. Same field as `TransactionPlan.segmentLengths`.\n * When omitted, each instruction is packed independently.\n */\n segmentLengths?: number[];\n /**\n * Segment indices (0-based, into the segments produced by `segmentLengths`)\n * that must always start a fresh bin. The current bin — if non-empty — is\n * flushed before the segment is appended, even if the segment would have\n * fit alongside it.\n *\n * Use case: a CPI whose on-chain check encodes a position-relative index\n * (e.g. Kamino's flash-borrow records `borrowInstructionIndex` for the\n * matching repay) needs the segment to land at a predictable index inside\n * its own tx. Marking that segment as a forced boundary keeps its index\n * stable regardless of how the preceding segments pack.\n */\n freshBinSegments?: number[];\n}\n\n/**\n * Turn a flat instruction list into indivisible segments for bin-packing.\n *\n * @throws If lengths are invalid or do not partition `instructions`.\n */\nexport function buildInstructionSegments(\n instructions: Instruction[],\n segmentLengths?: number[]\n): Instruction[][] {\n if (segmentLengths === undefined || segmentLengths.length === 0) {\n return instructions.map((ix) => [ix]);\n }\n\n const sum = segmentLengths.reduce((a, b) => a + b, 0);\n if (sum !== instructions.length) {\n throw new Error(\n `segmentLengths sum (${sum}) must equal instructions.length (${instructions.length}).`\n );\n }\n if (segmentLengths.some((n) => !Number.isInteger(n) || n <= 0)) {\n throw new Error(\"segmentLengths entries must be positive integers.\");\n }\n\n const segments: Instruction[][] = [];\n let offset = 0;\n for (const len of segmentLengths) {\n segments.push(instructions.slice(offset, offset + len));\n offset += len;\n }\n return segments;\n}\n\n/**\n * Split an instruction list into the minimum number of ordered bins where\n * each bin compiles to a transaction within the wire-size limit (minus\n * `reservedBytes` of headroom for post-split instruction injection).\n *\n * Preserves instruction ordering: segments and instructions are never\n * reordered across bins. Each bin is measured by actually compiling a v0\n * message with the provided fee payer + ALTs, so the measurement accounts for\n * signatures, account tables, and compact-u16 encoding exactly.\n *\n * Throws if:\n * - A single segment cannot fit in one tx (even alone).\n * - The total bins exceed `MAX_BUNDLE_TRANSACTIONS` (Jito's 5-tx limit).\n */\nexport async function splitIntoTransactionBins(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n instructions: Instruction[],\n options: SplitOptions = {}\n): Promise<SplitResult> {\n const {\n lookupTables,\n additionalSigners,\n blockhash,\n reservedBytes = 0,\n segmentLengths,\n freshBinSegments,\n } = options;\n const effectiveLimit = SOLANA_TX_SIZE_LIMIT - reservedBytes;\n const freshBinSet = freshBinSegments ? new Set(freshBinSegments) : undefined;\n\n if (effectiveLimit <= 0) {\n throw new Error(\n `reservedBytes (${reservedBytes}) is >= the tx size limit (${SOLANA_TX_SIZE_LIMIT}).`\n );\n }\n\n const segments = buildInstructionSegments(instructions, segmentLengths);\n\n const bins: Instruction[][] = [];\n let currentBin: Instruction[] = [];\n\n const measureCandidate = async (candidate: Instruction[]): Promise<number> => {\n const msg = await buildTransactionMessage(\n rpc,\n payer,\n candidate,\n lookupTables,\n additionalSigners,\n blockhash\n );\n return measureTxBytes(msg);\n };\n\n for (let segIdx = 0; segIdx < segments.length; segIdx += 1) {\n const segment = segments[segIdx];\n\n // If this segment must start a fresh bin, flush the current bin first\n // so the segment lands at the start of a new bin.\n if (freshBinSet?.has(segIdx) && currentBin.length > 0) {\n bins.push(currentBin);\n currentBin = [];\n }\n\n const candidate = [...currentBin, ...segment];\n const size = await measureCandidate(candidate);\n\n if (size <= effectiveLimit) {\n currentBin = candidate;\n continue;\n }\n\n // Segment doesn't fit in the current bin. If the bin is non-empty, flush\n // it and start a new bin with the whole segment. If the bin IS empty,\n // the segment is too large on its own — unrecoverable.\n if (currentBin.length === 0) {\n throw new Error(\n `An indivisible instruction group (${segment.length} instruction(s)) measures ` +\n `${size} bytes, exceeding the ${effectiveLimit}-byte effective tx size limit ` +\n `(${SOLANA_TX_SIZE_LIMIT} - ${reservedBytes} reserved) even with address lookup ` +\n `tables. Cannot split.`\n );\n }\n\n bins.push(currentBin);\n currentBin = [...segment];\n\n const segmentSize = await measureCandidate(currentBin);\n if (segmentSize > effectiveLimit) {\n throw new Error(\n `An indivisible instruction group (${segment.length} instruction(s)) measures ` +\n `${segmentSize} bytes, exceeding the ${effectiveLimit}-byte effective tx size limit ` +\n `(${SOLANA_TX_SIZE_LIMIT} - ${reservedBytes} reserved) even with address lookup ` +\n `tables. Cannot split.`\n );\n }\n }\n\n if (currentBin.length > 0) {\n bins.push(currentBin);\n }\n\n if (bins.length > MAX_BUNDLE_TRANSACTIONS) {\n throw new Error(\n `Instruction list requires ${bins.length} transactions, but Jito bundles ` +\n `allow at most ${MAX_BUNDLE_TRANSACTIONS}.`\n );\n }\n\n return { bins };\n}\n","/**\n * Diagnostic helpers for inspecting which addresses a transaction references\n * and whether they are covered by the caller's address lookup tables.\n *\n * Useful when bin-packing fails: if a segment is over the per-tx wire limit,\n * the cheapest fix is usually adding addresses to a LUT so the compiler can\n * compress them from 32-byte static keys down to 1-byte indices. This module\n * surfaces the candidates by cross-referencing every account touched by the\n * instruction list against the full contents of every passed LUT.\n */\n\nimport type { Address, Instruction, Rpc, SolanaRpcApi, TransactionSigner } from \"@solana/kit\";\nimport { compileTransaction, getCompiledTransactionMessageDecoder } from \"@solana/kit\";\n\nimport { lutManager } from \"../services/lutManager\";\nimport { buildTransactionMessage } from \"./transaction\";\n\nexport interface LutUsage {\n /** Addresses pulled from this LUT into the compiled message's writable section. */\n writable: Address[];\n /** Addresses pulled from this LUT into the compiled message's readonly section. */\n readonly: Address[];\n /** Total addresses stored in the LUT (capacity reference). */\n size: number;\n}\n\nexport interface AccountCoverageReport {\n /** Compiled message's static account list (programs, fee payer, anything not LUT'd). */\n staticAccounts: Address[];\n /** Per-LUT: which entries the compiler actually used, plus the LUT's full size. */\n lutUsage: Map<Address, LutUsage>;\n /** All distinct addresses referenced by the instructions (programs + accounts + fee payer). */\n referenced: Address[];\n /** Distinct program IDs across all instructions (forced into static keys). */\n programIds: Address[];\n /** Addresses referenced but NOT present in any caller-supplied LUT. */\n uncoveredByCallerLuts: Address[];\n /**\n * Subset of `uncoveredByCallerLuts` that excludes program IDs and the fee\n * payer — i.e., concrete candidates to add to a LUT for further compression.\n */\n candidatesToAddToLut: Address[];\n}\n\n/**\n * Compile the message with the caller's LUTs, decode the result, and produce\n * a report describing which addresses are static, which came from LUTs, and\n * which referenced addresses are still uncovered.\n *\n * Note: program IDs MUST live in the static account list — the v0 message\n * format does not allow LUT lookup for the program-id slot. The report keeps\n * them in `referenced` and `programIds` but excludes them from\n * `candidatesToAddToLut` since putting a program in a LUT cannot help.\n */\nexport async function reportAccountCoverage(\n rpc: Rpc<SolanaRpcApi>,\n payer: TransactionSigner,\n instructions: Instruction[],\n lookupTableAddresses: Address[] | undefined\n): Promise<AccountCoverageReport> {\n // Fetch the FULL contents of every caller-supplied LUT (regardless of which\n // entries the compiler ends up referencing) so we can answer \"is this\n // address in any of MY LUTs?\" — the actionable question for tightening\n // coverage.\n const callerLuts = lookupTableAddresses?.length\n ? await lutManager.getLookupTableInputs(rpc, lookupTableAddresses)\n : [];\n const callerLutAddressSet = new Set<Address>(callerLuts.flatMap((l) => l.addresses));\n\n // Compile the message with LUTs to see what actually got compressed and\n // what spilled into the static account list.\n const msg = await buildTransactionMessage(rpc, payer, instructions, lookupTableAddresses);\n const compiled = compileTransaction(msg);\n const decoded = getCompiledTransactionMessageDecoder().decode(compiled.messageBytes);\n const staticAccounts = (decoded.staticAccounts ?? []) as Address[];\n const altLookups = \"addressTableLookups\" in decoded ? (decoded.addressTableLookups ?? []) : [];\n\n const lutUsage = new Map<Address, LutUsage>();\n for (const lut of callerLuts) {\n lutUsage.set(lut.address, { writable: [], readonly: [], size: lut.addresses.length });\n }\n for (const lookup of altLookups) {\n const fullAddrs = callerLuts.find((l) => l.address === lookup.lookupTableAddress)?.addresses;\n const usage = lutUsage.get(lookup.lookupTableAddress) ?? {\n writable: [],\n readonly: [],\n size: fullAddrs?.length ?? 0,\n };\n if (fullAddrs) {\n usage.writable = lookup.writableIndexes.map((i) => fullAddrs[i] as Address);\n usage.readonly = lookup.readonlyIndexes.map((i) => fullAddrs[i] as Address);\n }\n lutUsage.set(lookup.lookupTableAddress, usage);\n }\n\n const referencedSet = new Set<Address>();\n const programSet = new Set<Address>();\n referencedSet.add(payer.address);\n for (const ix of instructions) {\n referencedSet.add(ix.programAddress);\n programSet.add(ix.programAddress);\n for (const acc of ix.accounts ?? []) {\n referencedSet.add(acc.address);\n }\n }\n\n const referenced = [...referencedSet];\n const programIds = [...programSet];\n const uncoveredByCallerLuts = referenced.filter((a) => !callerLutAddressSet.has(a));\n const candidatesToAddToLut = uncoveredByCallerLuts.filter(\n (a) => a !== payer.address && !programSet.has(a)\n );\n\n return {\n staticAccounts,\n lutUsage,\n referenced,\n programIds,\n uncoveredByCallerLuts,\n candidatesToAddToLut,\n };\n}\n\n/** Pretty-print a coverage report. Designed for CLI/script diagnostic use. */\nexport function logAccountCoverage(label: string, report: AccountCoverageReport): void {\n console.log(`\\n── Account coverage: ${label} ──`);\n console.log(\n `Compiled static accounts (${report.staticAccounts.length}) — programs, fee payer, and uncompressed:`\n );\n report.staticAccounts.forEach((a, i) => console.log(` [${i}] ${a}`));\n\n console.log(`\\nCaller-supplied LUTs (${report.lutUsage.size}):`);\n if (report.lutUsage.size === 0) {\n console.log(\" (none)\");\n }\n for (const [lut, usage] of report.lutUsage) {\n const used = usage.writable.length + usage.readonly.length;\n console.log(` ${lut} size=${usage.size} used=${used}`);\n if (usage.writable.length > 0) {\n console.log(` writable (${usage.writable.length}): ${usage.writable.join(\", \")}`);\n }\n if (usage.readonly.length > 0) {\n console.log(` readonly (${usage.readonly.length}): ${usage.readonly.join(\", \")}`);\n }\n }\n\n console.log(\n `\\nReferenced addresses: ${report.referenced.length} ` +\n `(${report.programIds.length} program ID${report.programIds.length === 1 ? \"\" : \"s\"})`\n );\n\n console.log(`\\nReferenced but NOT in any caller LUT (${report.uncoveredByCallerLuts.length}):`);\n if (report.uncoveredByCallerLuts.length === 0) {\n console.log(\" (none — every referenced address is in at least one caller LUT)\");\n } else {\n for (const a of report.uncoveredByCallerLuts) {\n const tag = report.programIds.includes(a) ? \" [PROGRAM — must be static]\" : \"\";\n console.log(` ${a}${tag}`);\n }\n }\n\n console.log(\n `\\nCandidates to add to a LUT (excludes programs + fee payer; ${report.candidatesToAddToLut.length}):`\n );\n if (report.candidatesToAddToLut.length === 0) {\n console.log(\" (none — uncovered addresses are all programs or the fee payer)\");\n } else {\n report.candidatesToAddToLut.forEach((a) => console.log(` ${a}`));\n }\n}\n","import { address, Address, Instruction, KeyPairSigner, Rpc, SolanaRpcApi } from \"@solana/kit\";\nimport { BN } from \"@anchor-lang/core\";\nimport { mints } from \"../services/mints/registry\";\nimport type { MintIdentifier } from \"../types\";\nimport {\n getInitializeMint2Instruction,\n getMintSize,\n TOKEN_PROGRAM_ADDRESS,\n} from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport { getCreateAccountInstruction } from \"@solana-program/system\";\nimport { signSendAndConfirmTransaction } from \"./transaction\";\nimport { type AnchorTokenProgram, tokenProgramToEnum, TokenProgram } from \"../types/enums\";\n\n/** Resolve a mint registry symbol or raw base58 address to a Kit {@link Address}. */\nexport function resolveTokenMint(token: MintIdentifier): Address {\n const known = mints.get(token);\n if (known) {\n return known.address;\n }\n\n return address(token as string);\n}\n\n/** Maps an `AnchorTokenProgram` value to its on-chain program address. */\nexport function resolveTokenProgram(tp: AnchorTokenProgram): Address {\n return tokenProgramToEnum(tp) === TokenProgram.Spl\n ? TOKEN_PROGRAM_ADDRESS\n : TOKEN_2022_PROGRAM_ADDRESS;\n}\n\n/**\n * Gets the token balance of an account (decimal-adjusted)\n *\n * @param tokenAccount - Token account to check\n * @returns Balance as a number (adjusted for decimals, e.g., 1000 USDC not 1000000000)\n */\nexport async function getTokenBalanceUi(\n rpc: Rpc<SolanaRpcApi>,\n tokenAccount: Address\n): Promise<number> {\n const response = await rpc\n .getTokenAccountBalance(tokenAccount, { commitment: \"confirmed\" })\n .send();\n return Number(response.value.uiAmount ?? 0);\n}\n\n/**\n * Gets the token balance of an account\n *\n * @param tokenAccount - Token account to check\n * @returns Balance as a number in base units\n */\nexport async function getTokenBalance(rpc: Rpc<SolanaRpcApi>, tokenAccount: Address): Promise<BN> {\n const response = await rpc\n .getTokenAccountBalance(tokenAccount, { commitment: \"confirmed\" })\n .send();\n return new BN(response.value.amount);\n}\n\n/**\n * Build instructions to create + initialize a new token mint.\n *\n * Prefer bundling these with the instruction that consumes the mint (e.g.\n * `create_token`) in the same transaction so simulation never races RPC\n * visibility of the newly created account.\n */\nexport async function getCreateMintInstructions(\n rpc: Rpc<SolanaRpcApi>,\n payer: KeyPairSigner,\n mintSigner: KeyPairSigner,\n authority: Address,\n decimals: number,\n tokenProgram: Address = TOKEN_PROGRAM_ADDRESS\n): Promise<Instruction[]> {\n const space = getMintSize();\n const rent = (await rpc.getMinimumBalanceForRentExemption(BigInt(space)).send()) as bigint;\n\n return [\n getCreateAccountInstruction({\n payer,\n newAccount: mintSigner,\n lamports: rent,\n space,\n programAddress: tokenProgram,\n }),\n getInitializeMint2Instruction({\n mint: mintSigner.address,\n decimals,\n mintAuthority: authority,\n }),\n ];\n}\n\n/**\n * Creates a new token mint in its own transaction.\n *\n * @param rpc - Solana RPC client\n * @param payer - Payer for account creation rent\n * @param mintSigner - Keypair signer for the new mint account\n * @param authority - Mint authority address (does not need to be a signer)\n * @param decimals - Number of decimals for the mint\n * @param tokenProgram - Token program (defaults to SPL Token)\n */\nexport async function createMint(\n rpc: Rpc<SolanaRpcApi>,\n payer: KeyPairSigner,\n mintSigner: KeyPairSigner,\n authority: Address,\n decimals: number,\n tokenProgram: Address = TOKEN_PROGRAM_ADDRESS\n): Promise<void> {\n const instructions = await getCreateMintInstructions(\n rpc,\n payer,\n mintSigner,\n authority,\n decimals,\n tokenProgram\n );\n\n await signSendAndConfirmTransaction(rpc, payer, instructions, {\n additionalSigners: [mintSigner],\n });\n}\n","// =============================================================================\n// Shared Anchor enum types + numeric enums + converters\n// =============================================================================\n\n// --- OracleType ---\n\nexport type AnchorOracleType =\n | { pyth: {} }\n | { switchboard: {} }\n | { perenaBank: {} }\n | { perenaTranche: {} }\n | { tpConsensusOracle: {} }\n | { pythSplStake: {} };\n\nexport enum OracleType {\n Pyth = 0,\n Switchboard = 1,\n PerenaBank = 2,\n PerenaTranche = 3,\n // LST priced from an SPL stake pool exchange rate × a Pyth SOL/USD feed\n // (capped at 1.1 × SOL/USD). The Pyth SOL feed is the primary oracle and the\n // SPL stake pool account is the secondary oracle.\n PythSplStake = 4,\n TPConsensusOracle = 5,\n}\n\nexport function oracleTypeToEnum(v: AnchorOracleType): OracleType {\n if (\"pyth\" in v) return OracleType.Pyth;\n if (\"switchboard\" in v) return OracleType.Switchboard;\n if (\"perenaBank\" in v) return OracleType.PerenaBank;\n if (\"perenaTranche\" in v) return OracleType.PerenaTranche;\n if (\"pythSplStake\" in v) return OracleType.PythSplStake;\n if (\"tpConsensusOracle\" in v) return OracleType.TPConsensusOracle;\n throw new Error(\"Unknown OracleType variant\");\n}\n\nexport function enumToOracleType(t: OracleType): AnchorOracleType {\n switch (t) {\n case OracleType.Pyth:\n return { pyth: {} };\n case OracleType.Switchboard:\n return { switchboard: {} };\n case OracleType.PerenaBank:\n return { perenaBank: {} };\n case OracleType.PerenaTranche:\n return { perenaTranche: {} };\n case OracleType.PythSplStake:\n return { pythSplStake: {} };\n case OracleType.TPConsensusOracle:\n return { tpConsensusOracle: {} };\n }\n}\n\n// --- ExternalLiquidityType ---\n\nexport type AnchorExternalLiquidityType = { none: {} } | { perenaWithdrawalQueue: {} };\n\nexport enum ExternalLiquidityType {\n None = 0,\n PerenaWithdrawalQueue = 1,\n}\n\nexport function ExternalLiquidityTypeToEnum(v: AnchorExternalLiquidityType): ExternalLiquidityType {\n if (\"none\" in v) return ExternalLiquidityType.None;\n if (\"perenaWithdrawalQueue\" in v) return ExternalLiquidityType.PerenaWithdrawalQueue;\n throw new Error(\"Unknown ExternalLiquidityType variant\");\n}\n\nexport function enumToExternalLiquidityType(t: ExternalLiquidityType): AnchorExternalLiquidityType {\n switch (t) {\n case ExternalLiquidityType.None:\n return { none: {} };\n case ExternalLiquidityType.PerenaWithdrawalQueue:\n return { perenaWithdrawalQueue: {} };\n }\n}\n\n// --- TokenProgram ---\n\nexport type AnchorTokenProgram = { spl: {} } | { token2022: {} };\n\nexport enum TokenProgram {\n Spl = 0,\n Token2022 = 1,\n}\n\nexport function tokenProgramToEnum(v: AnchorTokenProgram): TokenProgram {\n if (\"spl\" in v) return TokenProgram.Spl;\n if (\"token2022\" in v) return TokenProgram.Token2022;\n throw new Error(\"Unknown TokenProgram variant\");\n}\n\nexport function enumToTokenProgram(t: TokenProgram): AnchorTokenProgram {\n switch (t) {\n case TokenProgram.Spl:\n return { spl: {} };\n case TokenProgram.Token2022:\n return { token2022: {} };\n }\n}\n\n// --- LendingPlatform ---\n\nexport type AnchorLendingPlatform = { none: {} } | { marginfi: {} } | { kamino: {} };\n\nexport enum LendingPlatform {\n None = 0,\n Marginfi = 1,\n Kamino = 2,\n}\n\nexport function lendingPlatformToEnum(v: AnchorLendingPlatform): LendingPlatform {\n if (\"none\" in v) return LendingPlatform.None;\n if (\"marginfi\" in v) return LendingPlatform.Marginfi;\n if (\"kamino\" in v) return LendingPlatform.Kamino;\n throw new Error(\"Unknown LendingPlatform variant\");\n}\n\nexport function enumToLendingPlatform(t: LendingPlatform): AnchorLendingPlatform {\n switch (t) {\n case LendingPlatform.None:\n return { none: {} };\n case LendingPlatform.Marginfi:\n return { marginfi: {} };\n case LendingPlatform.Kamino:\n return { kamino: {} };\n }\n}\n","/**\n * Metaplex Token Metadata CPI helpers for building UpdateMetadataAccountV2\n * instruction data and CpiData for the CPI ref system.\n */\n\nimport {\n type Address,\n AccountRole,\n getAddressEncoder,\n getProgramDerivedAddress,\n} from \"@solana/kit\";\nimport { SYSTEM_PROGRAM_ADDRESS } from \"@solana-program/system\";\nimport { SYSVAR_RENT_ADDRESS } from \"@solana/sysvars\";\nimport {\n createUpdateMetadataAccountV2Instruction,\n createCreateMetadataAccountV3Instruction,\n Metadata,\n} from \"@metaplex-foundation/mpl-token-metadata\";\nimport type { Connection } from \"@solana/web3.js\";\nimport type { CpiData, CustomAccountMeta } from \"../types\";\nimport { CpiTypes } from \"../constants/generated/cpi\";\nimport { METAPLEX_TOKEN_METADATA_PROGRAM_ID } from \"../constants/general\";\nimport { toWeb3Pk } from \"./compat\";\n\nconst addressEncoder = getAddressEncoder();\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UpdateMetadataDataV2 {\n name: string;\n symbol: string;\n uri: string;\n sellerFeeBasisPoints?: number;\n}\n\nexport interface UpdateMetadataParams {\n data?: UpdateMetadataDataV2;\n newUpdateAuthority?: Address;\n primarySaleHappened?: boolean;\n isMutable?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Serialization (via mpl-token-metadata SDK)\n// ---------------------------------------------------------------------------\n\n/**\n * Serialize `UpdateMetadataAccountV2` instruction data using the Metaplex SDK.\n *\n * Uses `createUpdateMetadataAccountV2Instruction` from `@metaplex-foundation/mpl-token-metadata`\n * to build a full `TransactionInstruction`, then extracts the `.data` bytes. This avoids\n * manual Borsh serialization while keeping the result compatible with the CPI ref system.\n */\nexport function serializeUpdateMetadataAccountV2(\n metadataPda: Address,\n updateAuthority: Address,\n params: UpdateMetadataParams\n): Uint8Array {\n const ix = createUpdateMetadataAccountV2Instruction(\n {\n metadata: toWeb3Pk(metadataPda),\n updateAuthority: toWeb3Pk(updateAuthority),\n },\n {\n updateMetadataAccountArgsV2: {\n data: params.data\n ? {\n name: params.data.name,\n symbol: params.data.symbol,\n uri: params.data.uri,\n sellerFeeBasisPoints: params.data.sellerFeeBasisPoints ?? 0,\n creators: null,\n collection: null,\n uses: null,\n }\n : null,\n updateAuthority: params.newUpdateAuthority ? toWeb3Pk(params.newUpdateAuthority) : null,\n primarySaleHappened: params.primarySaleHappened ?? null,\n isMutable: params.isMutable ?? null,\n },\n }\n );\n\n return new Uint8Array(ix.data);\n}\n\n// ---------------------------------------------------------------------------\n// PDA Derivation\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// On-chain reader\n// ---------------------------------------------------------------------------\n\n/**\n * Display fields read out of the on-chain Metaplex metadata account, with\n * Metaplex's right-side null padding stripped.\n */\nexport interface OnchainTokenMetadata {\n name: string;\n symbol: string;\n uri: string;\n}\n\nfunction trimMetadataString(s: string): string {\n return s.replace(/\\0/g, \"\").trim();\n}\n\n/**\n * Fetches the Metaplex Token-Metadata account for `mint` and decodes the\n * three display fields. Returns `null` when the metadata account doesn't\n * exist (e.g. token was created without `update_token_metadata` ever firing).\n *\n * Throws on RPC errors so callers can choose between retry and fallback.\n *\n * Token-2022 mints with the metadata extension stored on the mint itself\n * are NOT covered here — every LYC mint goes through Metaplex via\n * `update_token_metadata`, so there's no second source to read.\n */\nexport async function fetchTokenMetadata(\n connection: Connection,\n mint: Address\n): Promise<OnchainTokenMetadata | null> {\n const metadataPda = await deriveMetadataPda(mint);\n const accountInfo = await connection.getAccountInfo(toWeb3Pk(metadataPda));\n if (!accountInfo) return null;\n const [decoded] = Metadata.fromAccountInfo(accountInfo);\n return {\n name: trimMetadataString(decoded.data.name),\n symbol: trimMetadataString(decoded.data.symbol),\n uri: trimMetadataString(decoded.data.uri),\n };\n}\n\n/**\n * Derive the Metaplex metadata PDA for a mint.\n *\n * Seeds: `[\"metadata\", METAPLEX_PROGRAM_ID, mint]`\n */\nexport async function deriveMetadataPda(mint: Address): Promise<Address> {\n const [pda] = await getProgramDerivedAddress({\n programAddress: METAPLEX_TOKEN_METADATA_PROGRAM_ID,\n seeds: [\n Buffer.from(\"metadata\"),\n addressEncoder.encode(METAPLEX_TOKEN_METADATA_PROGRAM_ID),\n addressEncoder.encode(mint),\n ],\n });\n return pda;\n}\n\n// ---------------------------------------------------------------------------\n// CpiData Builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a `CpiData` for `UpdateMetadataAccountV2` that can be passed\n * into `createCpiRefs()` and then to the `update_token_metadata` instruction.\n *\n * The Token PDA is the update authority and will be PDA-signed on-chain.\n *\n * Metaplex account order:\n * 0. metadata (writable)\n * 1. update_authority (Token PDA — signer set on-chain via invoke_signed)\n *\n * @example\n * ```typescript\n * const cpiData = await buildUpdateMetadataCpiData({\n * mint: yTokenMint,\n * updateAuthority: tokenPda,\n * data: { name: \"ySOL\", symbol: \"ySOL\", uri: \"https://...\" },\n * });\n * const { accounts, refs } = createCpiRefs([cpiData]);\n * ```\n */\nexport async function buildUpdateMetadataCpiData(params: {\n mint: Address;\n updateAuthority: Address;\n data?: UpdateMetadataDataV2;\n newUpdateAuthority?: Address;\n primarySaleHappened?: boolean;\n isMutable?: boolean;\n}): Promise<CpiData> {\n const metadataPda = await deriveMetadataPda(params.mint);\n\n const accounts: CustomAccountMeta[] = [\n { address: metadataPda, role: AccountRole.WRITABLE },\n { address: params.updateAuthority, role: AccountRole.READONLY },\n ];\n\n const data = serializeUpdateMetadataAccountV2(metadataPda, params.updateAuthority, {\n data: params.data,\n newUpdateAuthority: params.newUpdateAuthority,\n primarySaleHappened: params.primarySaleHappened,\n isMutable: params.isMutable,\n });\n\n return {\n cpiType: CpiTypes.MPL_UPDATE_METADATA,\n programId: METAPLEX_TOKEN_METADATA_PROGRAM_ID,\n accounts,\n data,\n };\n}\n\n/**\n * Build a `CpiData` for `CreateMetadataAccountV3` that can be passed\n * into `createCpiRefs()` and then to the `update_token_metadata` instruction.\n *\n * Use this when no Metaplex metadata account exists yet for the mint.\n * The Token PDA is both the mint authority (PDA-signed on-chain) and the\n * update authority. The admin keypair is the payer and must be included in\n * remaining_accounts.\n *\n * Metaplex account order:\n * 0. metadata (writable)\n * 1. mint (writable)\n * 2. mint_authority / Token PDA (PDA-signed on-chain)\n * 3. payer / admin (writable, signer)\n * 4. update_authority / Token PDA (readonly)\n * 5. system_program (readonly)\n * 6. rent sysvar (readonly)\n */\nexport async function buildCreateMetadataCpiData(params: {\n mint: Address;\n mintAuthority: Address;\n payer: Address;\n updateAuthority: Address;\n data: UpdateMetadataDataV2;\n}): Promise<CpiData> {\n const metadataPda = await deriveMetadataPda(params.mint);\n\n const ix = createCreateMetadataAccountV3Instruction(\n {\n metadata: toWeb3Pk(metadataPda),\n mint: toWeb3Pk(params.mint),\n mintAuthority: toWeb3Pk(params.mintAuthority),\n payer: toWeb3Pk(params.payer),\n updateAuthority: toWeb3Pk(params.updateAuthority),\n },\n {\n createMetadataAccountArgsV3: {\n data: {\n name: params.data.name,\n symbol: params.data.symbol,\n uri: params.data.uri,\n sellerFeeBasisPoints: params.data.sellerFeeBasisPoints ?? 0,\n creators: null,\n collection: null,\n uses: null,\n },\n isMutable: true,\n collectionDetails: null,\n },\n }\n );\n\n const accounts: CustomAccountMeta[] = [\n { address: metadataPda, role: AccountRole.WRITABLE },\n { address: params.mint, role: AccountRole.WRITABLE },\n { address: params.mintAuthority, role: AccountRole.READONLY },\n { address: params.payer, role: AccountRole.WRITABLE },\n { address: params.updateAuthority, role: AccountRole.READONLY },\n { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY },\n { address: SYSVAR_RENT_ADDRESS, role: AccountRole.READONLY },\n ];\n\n return {\n cpiType: CpiTypes.MPL_CREATE_METADATA,\n programId: METAPLEX_TOKEN_METADATA_PROGRAM_ID,\n accounts,\n data: new Uint8Array(ix.data),\n };\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport type { TransactionPlan } from \"../utils/transaction\";\n\n/**\n * Shared base for SDK instruction/transaction builders.\n *\n * `getIx(args)` is intentionally explicit: callers must provide the fully\n * resolved instruction inputs. Higher-level `getTx()` paths should derive those\n * inputs locally, then call `getIx(args)` without persisting them on the\n * builder instance.\n */\nexport abstract class BaseIXBuilderService<\n TContext,\n TIxArgs,\n TTxArgs = TIxArgs,\n TTxResult = TransactionPlan,\n> {\n constructor(protected readonly context: TContext) {}\n\n abstract getIx(args: TIxArgs): Promise<Instruction>;\n\n abstract getTx(args: TTxArgs): Promise<TTxResult>;\n}\n\n/**\n * Helper for single-instruction builders whose transaction output is a standard\n * `TransactionPlan`.\n */\nexport abstract class SingleInstructionBuilderService<\n TContext,\n TIxArgs,\n TTxArgs = TIxArgs,\n TTxPlan extends TransactionPlan = TransactionPlan,\n> extends BaseIXBuilderService<TContext, TIxArgs, TTxArgs, TTxPlan> {\n protected async deriveIxArgs(txArgs: TTxArgs): Promise<TIxArgs> {\n return txArgs as unknown as TIxArgs;\n }\n\n protected async buildPreambleInstructions(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<Instruction[]> {\n return [];\n }\n\n protected async buildLookupTables(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<readonly Address[] | undefined> {\n return undefined;\n }\n\n protected async buildPlanExtras(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<Omit<TTxPlan, \"instructions\" | \"lookupTables\"> | undefined> {\n return undefined;\n }\n\n async getTx(txArgs: TTxArgs): Promise<TTxPlan> {\n const args = await this.deriveIxArgs(txArgs);\n const preambleInstructions = await this.buildPreambleInstructions(args, txArgs);\n const instruction = await this.getIx(args);\n const lookupTables = await this.buildLookupTables(args, txArgs);\n const extras = await this.buildPlanExtras(args, txArgs);\n\n return {\n instructions: [...preambleInstructions, instruction],\n ...(lookupTables?.length ? { lookupTables: [...lookupTables] } : {}),\n ...(extras ?? {}),\n } as TTxPlan;\n }\n}\n","import { BN } from \"@anchor-lang/core\";\nimport type { Address } from \"@solana/kit\";\nimport { fromUiAmount } from \"common\";\nimport type { YieldingBankExternalLiquiditySource } from \"../client/types\";\n\n/**\n * PodBool is a Rust `#[repr(transparent)]` newtype over `u8`.\n * Anchor deserializes tuple-struct fields using positional integer keys, so\n * `PodBool(1)` arrives from the RPC as `{ '0': 1 }` instead of a plain number.\n *\n * This helper extracts the underlying u8 value so callers work with a plain\n * number rather than the intermediate struct object.\n */\nexport function podBoolToNumber(val: { 0: number } | number): number {\n if (typeof val === \"number\") return val;\n return (val as Record<string | number, number>)[0] ?? 0;\n}\n\n/**\n * Build external-liquidity source descriptors for one mint across multiple accounts.\n */\nexport function toYieldingBankExternalLiquiditySources(\n mint: Address,\n accounts: Address[]\n): YieldingBankExternalLiquiditySource[] {\n return accounts.map((account) => ({ mint, account }));\n}\n\n/**\n * Convert a raw token amount and raw oracle price into 8-decimal USD TVL units.\n */\nexport function amountToTvl(\n amount: number | bigint | BN,\n price: number | bigint | BN,\n decimals: number\n): BN {\n const amountBn = new BN(amount.toString());\n const priceBn = new BN(price.toString());\n const assetScale = fromUiAmount(1, decimals);\n const tvlScale = fromUiAmount(1, 8);\n const scaleFactor = assetScale.mul(assetScale).div(tvlScale);\n return amountBn.mul(priceBn).div(scaleFactor);\n}\n\nconst EPOCH_BUCKET_MS = 60_000;\n\n/**\n * Generate a redemption epoch ID by flooring `Date.now()` to the nearest minute.\n * Burns within the same 60-second window will share an epoch PDA, allowing the\n * manager to batch-process them together.\n */\nexport function currentEpochId(): BN {\n return new BN(Math.floor(Date.now() / EPOCH_BUCKET_MS) * EPOCH_BUCKET_MS);\n}\n","/**\n * Collectable net yield in 8-decimal normalized USD: any carry surplus above\n * debt. Returns `0n` when carry TVL does not exceed debt TVL.\n *\n * Used by SDK planning and metrics to size collect-interest attempts.\n *\n * @param totalCarryTvlUsd Aggregate carry-position TVL (8-dec USD).\n * @param totalDebtUsd Aggregate lending-position debt TVL (8-dec USD).\n */\nexport function collectableNetYieldUsd(totalCarryTvlUsd: bigint, totalDebtUsd: bigint): bigint {\n return totalCarryTvlUsd > totalDebtUsd ? totalCarryTvlUsd - totalDebtUsd : 0n;\n}\n","import { type Address } from \"@solana/kit\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { IdlAccounts } from \"@anchor-lang/core\";\nimport { LongYieldCarry } from \"../idl/long_yield_carry\";\nimport { fromWeb3Pk, toUiAmount } from \"common\";\nimport { podBoolToNumber } from \"../utils/general\";\nimport { TOKEN_STALENESS_THRESHOLD_SECS } from \"../constants/general\";\n\n/** Decoded on-chain data for a YieldingBank account, derived from the IDL. */\nexport type YieldingBankAccountData = IdlAccounts<LongYieldCarry>[\"yieldingBank\"];\n\n/**\n * Wrapper around the raw YieldingBank account data from the program.\n *\n * Provides typed access to on-chain state and a home for\n * derived/computed helpers as the SDK grows.\n */\nexport class LYCYieldingBank {\n constructor(\n /** The YieldingBank PDA address this data was fetched from */\n readonly address: Address,\n /** Deserialized account data */\n readonly data: YieldingBankAccountData\n ) {}\n\n get circuitBreaker(): number {\n return podBoolToNumber(this.data.config.circuitBreaker);\n }\n\n get isActive(): boolean {\n return this.circuitBreaker === 0;\n }\n\n get config(): YieldingBankAccountData[\"config\"] {\n return this.data.config;\n }\n\n get accounting(): YieldingBankAccountData[\"accounting\"] {\n return this.data.accounting;\n }\n\n get baseMint(): Address {\n return fromWeb3Pk(this.data.config.baseMint);\n }\n\n get defaultRedemptionMint(): Address {\n return fromWeb3Pk(this.data.config.defaultRedemptionMint);\n }\n\n get id(): number {\n return this.data.config.id;\n }\n\n get decimals(): number {\n return this.data.config.decimals;\n }\n\n get timeCreatedTs(): bigint {\n return BigInt(this.data.config.timeCreatedTs.toString());\n }\n\n get sharePrice(): number {\n return toUiAmount(this.data.accounting.sharePrice, this.decimals);\n }\n\n get totalShares(): number {\n return toUiAmount(this.data.accounting.totalShares, this.decimals);\n }\n\n /**\n * `true` when the bank's cached `lastRefreshedTs` is older than the\n * client-side staleness threshold and a `refresh_yielding_bank` ix should\n * be prepended before any handler that calls `verify_price_is_fresh`.\n */\n get isStale(): boolean {\n const lastRefreshed = this.data.accounting.lastRefreshedTs.toNumber();\n const nowSecs = Math.floor(Date.now() / 1000);\n return nowSecs - lastRefreshed > TOKEN_STALENESS_THRESHOLD_SECS;\n }\n\n get baseAsset(): YieldingBankAccountData[\"baseAsset\"] {\n return this.data.baseAsset;\n }\n\n get assets(): YieldingBankAccountData[\"assets\"] {\n return this.data.assets;\n }\n\n get externalYieldingPositions(): YieldingBankAccountData[\"externalYieldingPositions\"] {\n return this.data.externalYieldingPositions;\n }\n\n /**\n * Find the asset holding entry for a given mint across the bank's\n * base asset and additional assets. Returns null if not held.\n */\n findAssetHolding(mint: Address): YieldingBankAccountData[\"baseAsset\"] | null {\n if (this.baseMint === mint) {\n return this.data.baseAsset;\n }\n\n for (const asset of this.data.assets) {\n if (asset.mint.equals(PublicKey.default)) continue;\n if (fromWeb3Pk(asset.mint) === mint) {\n return asset;\n }\n }\n\n return null;\n }\n\n /**\n * Returns the flat index for the asset holding matching the given mint\n * (0 = base_asset, 1–12 = assets[0–11]), or null if not found.\n */\n findAssetHoldingIndex(mint: Address): number | null {\n if (this.baseMint === mint) return 0;\n\n for (let i = 0; i < this.data.assets.length; i++) {\n const asset = this.data.assets[i];\n if (asset.mint.equals(PublicKey.default)) continue;\n if (fromWeb3Pk(asset.mint) === mint) return i + 1;\n }\n\n return null;\n }\n}\n","import { BN } from \"@anchor-lang/core\";\nimport { Address, address } from \"@solana/kit\";\nimport {\n DEPLOYED_ADMIN_KEYPAIR_FP,\n PROTOCOL_ADMIN,\n type DeployedEnv,\n type Environment,\n} from \"common\";\n\n/** Program ID per environment */\nexport const PROGRAM_ID: Record<Environment, Address> = {\n local: address(\"7YPAKESPJ7zJAvBuk45ZVziu6tXGKoNzg3p9YpvrH6pX\"),\n test: address(\"7C39GeKrqLygmgV9D4bicUaiyFhKrX6Eevk6PDACwuj7\"),\n prod: address(\"LYC8YiiSzQfPpxUW2tpxfuPKGZwywAJhXKUfDP2B66f\"),\n};\n\n/** Deployed `long_yield_carry` program IDs. */\nexport const LYC_PROGRAM_IDS = new Set<string>(Object.values(PROGRAM_ID).map(String));\n\n/** Manager authority for manager-gated instruction accounts */\nexport const MANAGER: Record<Environment, Address> = {\n local: address(\"4g1CzxGL2hopch95Aeww9RrQjx3NPq7NgN9QFK7jx8X1\"),\n test: address(\"AqB478KVcoBwV39QjftJQ6qvV9xTh8CYB9jEnc2XSNLu\"),\n prod: address(\"2kv6b4wmbF2ausJ3spLDzpNCei64NzCkHKQhyL2sQgWu\"),\n};\n\n/** Circuit breaker controller for circuit-breaker-gated instruction accounts */\nexport const CIRCUIT_BREAKER_CONTROLLER: Record<Environment, Address> = {\n local: address(\"CAcAFXBQBbr5xpESdbd9L1tEijPq1o2bdxju56qMZssj\"),\n test: address(\"Wrj4caR4RJcmPgrRBE3HyFVMRKEmd2Y1ZuChbcjdeQu\"),\n prod: address(\"Fpm61bZCvoucprM5YQJRS2V9nSduvjQDn3h7pfCRL4Ld\"),\n};\n\n/** Re-exported from `common` — see {@link PROTOCOL_ADMIN} there. */\nexport { PROTOCOL_ADMIN };\n\n/**\n * Protocol fee wallet — receives the protocol share of mint/burn + perf fees\n * and serves as the on-chain fallback for a token's `roles.fees` when unset\n * (`TokenRoles::curator_fee_wallet()` delegates to `protocol_fee_wallet()`).\n */\nexport const PROTOCOL_FEE_WALLET: Record<Environment, Address> = {\n local: address(\"Fo6ihiHavRRnFG7k24JgwxNqVt6j7FWAWxDwoGoKd2MY\"),\n test: address(\"8L2dWQqs6oQW6GCwp3fuosFTi5uCRJcbhhCKkjtyFG2e\"),\n prod: address(\"Fo6ihiHavRRnFG7k24JgwxNqVt6j7FWAWxDwoGoKd2MY\"), // TODO\n};\n\n/** Redemption epoch status: accepting new async burn requests. */\nexport const REDEMPTION_EPOCH_STATUS_OPEN = 0;\n/** Redemption epoch status: closed to new requests, collateral being funded. */\nexport const REDEMPTION_EPOCH_STATUS_FUNDING = 1;\n/** Redemption epoch status: funded, individual burn requests being processed. */\nexport const REDEMPTION_EPOCH_STATUS_PROCESSING = 2;\n\n/**\n * On-chain `TokenAccounting::MAX_FRESHNESS_SECS` = ONE_HOUR (3600s).\n * We use a 120s buffer so the refresh lands before on-chain staleness kicks in.\n */\nexport const TOKEN_STALENESS_THRESHOLD_SECS = 3600 - 120;\n\n/** Maximum heap-frame size requested by composed multi-CPI transactions. */\nexport const MAX_HEAP_FRAME_BYTES = 256 * 1024;\n\n/**\n * Mirror of the on-chain `REBALANCE_TOKEN_RATE_LIMIT_SECS` (24 hours). The\n * program rejects a `rebalance_token` on a lending position that was already\n * rebalanced within this window (`RebalanceRateLimited`); the SDK skips such\n * candidates client-side so we never build a transaction that would revert.\n */\nexport const REBALANCE_TOKEN_RATE_LIMIT_SECS = 24 * 60 * 60;\n\n/** Default recollateralize-loss swap slippage, capped by the on-chain 150 bps check. */\nexport const DEFAULT_RECOLLATERALIZE_LOSS_SLIPPAGE_BPS = 150;\n\n/**\n * Minimum claimable reward (in the reward token's UI units) for an incentive to\n * be worth harvesting. Below this, the on-chain `HarvestReward` moves only dust\n * while still costing a transaction fee, so `getOutstandingIncentives` omits it.\n */\nexport const DEFAULT_MIN_INCENTIVE_UI_AMOUNT = 0.01;\n\n/**\n * Sentinel value (u64::MAX) that callers can pass as an amount to `mint_token`\n * or `burn_token` to indicate \"use the entire balance\".\n * - mint_token: deposits the full collateral ATA balance.\n * - burn_token: burns the full yToken ATA balance.\n */\nexport const AMOUNT_ALL_SENTINEL = new BN(\"18446744073709551615\");\n\n/** Re-exported from `common` — see {@link DEPLOYED_ADMIN_KEYPAIR_FP} there. */\nexport const LYC_ADMIN_KEYPAIR_FP = DEPLOYED_ADMIN_KEYPAIR_FP;\n\n/**\n * Filesystem paths to the manager keypair for future manager CLI scripts,\n * fixed per deployment tier (no env overrides).\n */\nexport const LYC_MANAGER_KEYPAIR_FP: Record<DeployedEnv, string> = {\n test: \"~/.config/solana/tp/lyc-manager-test.json\",\n prod: \"~/.config/solana/tp/lyc-manager-prod.json\",\n};\n\n/**\n * Filesystem paths to the circuit breaker controller keypair.\n * Used by emergency scripts (trigger circuit breaker, reset burn rate limit).\n */\nexport const LYC_CB_KEYPAIR_FP: Record<DeployedEnv, string> = {\n test: \"~/.config/solana/tp/lyc-cb-test.json\",\n prod: \"~/.config/solana/tp/lyc-cb-prod.json\",\n};\n\n/**\n * Shared general LUT per remote deployment tier (`test` | `prod`), same split as\n * {@link LYC_ADMIN_KEYPAIR_FP}. Populate via `pnpm run update-general-lut -- test|prod`.\n */\nexport const GENERAL_LOOKUP_TABLES: Record<DeployedEnv, Address> = {\n test: address(\"GbiTxgWknTyRD2qwCvtytPXa1KnCwJWqakH4mJRpU3mF\"),\n prod: address(\"4ZP1hmYuePwAwmr2uHvjRL12okdG2krf4A9sacSxvHcs\"),\n};\n\nexport const TOKEN_LOOKUP_TABLES: Record<Address, Address> = {\n // TEST\n [address(\"7fEA5HTsveMn5HfnXN82nmTniXeWDs6YJuvLyk7qFcNG\")]: address(\n \"HTBxsGsKgfMmPVuxdia1PQkdATUrFofmbJAtC7he6qEK\"\n ),\n [address(\"2BGSs7s5mSJgSCMcppAaQj5Ppp1kHmQNQ9ESoGWK2Hmx\")]: address(\n \"5UmqM2LE4RwpF91aXiXNVB5tSJKsLoVfxLA3gc6Qrj35\"\n ),\n [address(\"6qtzJnVn6nTZXJhcAUgmofKsTYuaSp8ag1BcxcE9EEz7\")]: address(\n \"DJstSjLyA4KwhgRh3s1Bd28eSoke8st6nAXTDNVtckqj\"\n ),\n [address(\"3m9Nx5ZCghjsMPmBpJm1ZWb27SUHLzdUJdwb2mquo3Kb\")]: address(\n \"3bZYrhiqee6zPCvnXqMjNjtN5M7aPa4rebvmEtVUvGwG\"\n ),\n [address(\"HbhfU6ihxuzzpwmdgpWP5QC6HpemnMGZANCQEDQ7V92L\")]: address(\n \"EJSQZD9qzqaBacntUgouM9dmo9dgeBechNvASZ3V4NRr\"\n ),\n [address(\"GphwC2jwG3mcM8FYFFm5j8A4jNw3i7Hhic4poLbnoKpu\")]: address(\n \"6x8fiZxU6f82a3grAECC8nLuwkFoBPjFwAYhfpbeqw18\"\n ),\n [address(\"975Zp2WbD7WQfG6mTDPVUjc4mbEALMBXeyn4Pwr45f7p\")]: address(\n \"9ERF9KcYvehmMku9mqAvzhduDHpJu36pcvZ3xr2NJJ9o\"\n ),\n // PROD\n [address(\"6MSD4oSiJq8y5hmryCuMykyTjNXbhha6HSAtrT1EFKQe\")]: address(\n \"D5DndWnaEP7JN2vVftG2UE3v1AYjrG1zUPi9MTF67jmf\"\n )\n};\n","import { type Address } from \"@solana/kit\";\nimport { IdlTypes } from \"@anchor-lang/core\";\nimport {\n IX_SYSVAR_META,\n createMultiCpiRefs,\n type CustomAccountMeta,\n type InstructionRefs,\n toWeb3Pk,\n toCustomAccountMeta,\n} from \"common\";\nimport type { LongYieldCarry } from \"../idl/long_yield_carry\";\nimport type {\n AssetConfig,\n AssetAllocationConfig,\n DecreaseCarryPositionPlan,\n ExternalPositionConfig,\n YieldingBankAllocationConfig,\n} from \"../client/types\";\n\nfunction toAnchorAssetConfig(cfg: AssetConfig) {\n return {\n oracle: toWeb3Pk(cfg.oracle),\n oracleType: cfg.oracleType,\n externalLiquidity: cfg.externalLiquidityType,\n };\n}\n\nfunction toAnchorAssetAllocationConfig(cfg: AssetAllocationConfig) {\n return {\n mint: toWeb3Pk(cfg.mint),\n decimals: cfg.decimals,\n tokenProgram: cfg.tokenProgram,\n };\n}\n\nfunction toAnchorExternalPositionConfig(cfg: ExternalPositionConfig) {\n return {\n lendingPlatform: cfg.lendingPlatform,\n lendingType: cfg.lendingType,\n pool: toWeb3Pk(cfg.pool),\n collateralReserve: toWeb3Pk(cfg.collateralReserve),\n debtReserve: toWeb3Pk(cfg.debtReserve),\n protocolUserAcc: toWeb3Pk(cfg.protocolUserAcc),\n collateral: toAnchorAssetAllocationConfig(cfg.collateral),\n debt: toAnchorAssetAllocationConfig(cfg.debt),\n };\n}\n\nexport function toAnchorAllocationConfig(\n cfg: YieldingBankAllocationConfig\n): IdlTypes<LongYieldCarry>[\"yieldingBankAllocationConfig\"] {\n return {\n assetHolding: cfg.assetHolding ? toAnchorAssetConfig(cfg.assetHolding) : null,\n externalPosition: cfg.externalPosition\n ? toAnchorExternalPositionConfig(cfg.externalPosition)\n : null,\n };\n}\n\n/**\n * Build the carry-trade account metas that are prepended to remaining_accounts\n * for increase/decrease carry position instructions.\n *\n * The two ATA accounts are tagged with `isRequiredAta` so that\n * `getCreateAtaInstructions` will create them if they don't yet exist.\n *\n * Order must match `parse_carry_trade_accounts` on the Rust side:\n * 0. token (writable)\n * 1. yieldingBank (writable)\n * 2. tokenLpDebtTa (writable, ATA)\n * 3. yieldingBankTa (writable, ATA)\n * 4. lendingPositionUserAccount (readonly)\n * 5. lendingPositionCollateralReserve (readonly)\n * 6. debtOracle (readonly)\n * 7. debtTokenProgram (readonly)\n * 8. instructions_sysvar (readonly)\n */\nexport function buildCarryTradeAccountMetas(\n token: Address,\n yieldingBank: Address,\n tokenLpDebtTa: Address,\n yieldingBankTa: Address,\n lendingPositionUserAccount: Address,\n lendingPositionCollateralReserve: Address,\n debtOracle: Address,\n debtMint: Address,\n debtTokenProgram: Address\n): CustomAccountMeta[] {\n return [\n toCustomAccountMeta(token, true),\n toCustomAccountMeta(yieldingBank, true),\n toCustomAccountMeta(tokenLpDebtTa, true, {\n owner: token,\n mint: debtMint,\n tokenProgram: debtTokenProgram,\n }),\n toCustomAccountMeta(yieldingBankTa, true, {\n owner: yieldingBank,\n mint: debtMint,\n tokenProgram: debtTokenProgram,\n }),\n toCustomAccountMeta(lendingPositionUserAccount),\n toCustomAccountMeta(lendingPositionCollateralReserve),\n toCustomAccountMeta(debtOracle),\n toCustomAccountMeta(debtTokenProgram),\n IX_SYSVAR_META,\n ];\n}\n\n/**\n * Build the initial remaining-accounts prefix for `rebalance_token`.\n *\n * Order must match `RebalanceTokenAccounts::parse` on the Rust side:\n * 0. token (writable)\n * 1. yieldingBank (writable)\n * 2. sourceDebtTokenProgram (readonly)\n * 3. yieldingBankSourceDebtAta (writable, ATA)\n * 4. sourceLpUserAccount (readonly)\n * 5. sourceLpCollateralReserve (readonly)\n * 6. sourceLpDebtOracle (readonly — also serves as the\n * dust-sweep source_debt_oracle)\n * 7. destinationLpUserAccount (readonly)\n * 8. destinationLpCollateralReserve (readonly)\n * 9. destinationLpDebtOracle (readonly)\n *\n * The destination debt mint is referenced by inner CPIs (borrow / swap) and\n * reaches the pool through CPI dedup; it does not need a fixed slot here.\n * The token PDA's source-debt ATA is part of the flash-borrow / repay path\n * and is also resolved at runtime from the CPI account pool — only the\n * yielding-bank's source-debt ATA needs an explicit slot for the dust sweep.\n */\nexport function buildRebalanceTokenInitialAccounts(args: {\n token: Address;\n yieldingBank: Address;\n sourceDebtMint: Address;\n sourceDebtTokenProgram: Address;\n yieldingBankSourceDebtAta: Address;\n lpUserAccount: Address;\n sourceDebtOracle: Address;\n destinationDebtOracle: Address;\n}): CustomAccountMeta[] {\n return [\n toCustomAccountMeta(args.token, true),\n toCustomAccountMeta(args.yieldingBank, true),\n toCustomAccountMeta(args.sourceDebtTokenProgram),\n toCustomAccountMeta(args.yieldingBankSourceDebtAta, true, {\n owner: args.yieldingBank,\n mint: args.sourceDebtMint,\n tokenProgram: args.sourceDebtTokenProgram,\n }),\n toCustomAccountMeta(args.lpUserAccount),\n toCustomAccountMeta(args.sourceDebtOracle),\n toCustomAccountMeta(args.destinationDebtOracle),\n ];\n}\n\n/**\n * Normalize grouped CPI refs for `decrease_carry_position`.\n *\n * The plan can contain either:\n * - one group: repay only, or\n * - two groups: yielding-bank swap/redeem first, then repay.\n */\nexport function resolveDecreaseCarryIxRefs(\n refsGroups: InstructionRefs[],\n options?: { hasTokenPrerequisiteCpis?: boolean }\n): {\n ybIxRefs?: InstructionRefs;\n prerequisiteCpis?: InstructionRefs;\n tokenIxRefs: InstructionRefs;\n} {\n const hasTokenPrerequisiteCpis = options?.hasTokenPrerequisiteCpis ?? false;\n const lastRefs = refsGroups[refsGroups.length - 1];\n\n if (!lastRefs) {\n throw new Error(\"Expected at least one CPI ref group for decrease carry flow\");\n }\n\n const prerequisiteCpis = hasTokenPrerequisiteCpis ? refsGroups[refsGroups.length - 2] : undefined;\n if (hasTokenPrerequisiteCpis && !prerequisiteCpis) {\n throw new Error(\"Expected prerequisite CPI ref group for decrease carry flow\");\n }\n\n const ybIxRefs =\n refsGroups[0] && refsGroups[0] !== prerequisiteCpis && refsGroups[0] !== lastRefs\n ? refsGroups[0]\n : undefined;\n\n return {\n tokenIxRefs: lastRefs,\n ...(prerequisiteCpis ? { prerequisiteCpis } : {}),\n ...(ybIxRefs ? { ybIxRefs } : {}),\n };\n}\n\nexport interface ResolvedDecreaseCarryCpiPlan {\n accounts: CustomAccountMeta[];\n lookupTables: Address[];\n ybIxRefs?: InstructionRefs;\n prerequisiteCpis?: InstructionRefs;\n tokenIxRefs: InstructionRefs;\n}\n\n/**\n * Build the grouped CPI pool for `decrease_carry_position` and normalize the\n * resulting ref groups into the instruction params the SDK passes on-chain.\n */\nexport function resolveDecreaseCarryCpiPlan(\n plan: DecreaseCarryPositionPlan\n): ResolvedDecreaseCarryCpiPlan {\n const cpiDataGroups = [\n ...(plan.cpiDataGroups.length === 2 ? [plan.cpiDataGroups[0]] : []),\n ...(plan.tokenPrerequisiteCpis?.length ? [plan.tokenPrerequisiteCpis] : []),\n plan.cpiDataGroups[plan.cpiDataGroups.length - 1],\n ];\n const { accounts, refsGroups, lookupTables } = createMultiCpiRefs(cpiDataGroups, {\n initialAccounts: plan.initialAccounts,\n });\n\n return {\n accounts,\n lookupTables,\n ...resolveDecreaseCarryIxRefs(refsGroups, {\n hasTokenPrerequisiteCpis: Boolean(plan.tokenPrerequisiteCpis?.length),\n }),\n };\n}\n","import {\n type Address,\n type ProgramDerivedAddressBump,\n getAddressEncoder,\n getProgramDerivedAddress,\n} from \"@solana/kit\";\n\nconst addressEncoder = getAddressEncoder();\n\nfunction u64LeBytes(value: bigint | number): Uint8Array {\n const bytes = new Uint8Array(8);\n const view = new DataView(bytes.buffer);\n view.setBigUint64(0, BigInt(value), true);\n return bytes;\n}\n\n/**\n * PDA derivation for the long_yield_carry program.\n *\n * The program ID is injected via constructor — no global state.\n */\nexport class PdaClient {\n constructor(private readonly programAddress: Address) {}\n\n /**\n * Derives the Token PDA for a given mint and ID.\n *\n * Seeds: [\"TOKEN\", mint_pubkey, id]\n *\n * @param mintAddress - The yToken mint address\n * @param id - The token ID (u8)\n * @returns Tuple of [PDA address, bump seed]\n */\n async deriveTokenPda(\n mintAddress: Address,\n id: number\n ): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return await getProgramDerivedAddress({\n programAddress: this.programAddress,\n seeds: [Buffer.from(\"TOKEN\"), addressEncoder.encode(mintAddress), new Uint8Array([id])],\n });\n }\n\n /**\n * Derives the YieldingBank PDA for a given base mint and yielding ID.\n *\n * Seeds: [\"YIELDING_BANK\", base_mint_pubkey, id_le_bytes]\n *\n * @param baseMint - The base mint address\n * @param yieldingId - The yielding bank ID (u8)\n * @returns Tuple of [PDA address, bump seed]\n */\n async deriveYieldingBankPda(\n baseMint: Address,\n yieldingId: number\n ): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return await getProgramDerivedAddress({\n programAddress: this.programAddress,\n seeds: [\n Buffer.from(\"YIELDING_BANK\"),\n addressEncoder.encode(baseMint),\n new Uint8Array([yieldingId]),\n ],\n });\n }\n\n async deriveRedemptionEpochPda(\n token: Address,\n epochId: bigint | number\n ): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return await getProgramDerivedAddress({\n programAddress: this.programAddress,\n seeds: [Buffer.from(\"REDEMPTION_EPOCH\"), addressEncoder.encode(token), u64LeBytes(epochId)],\n });\n }\n\n async deriveAsyncBurnRequestPda(\n token: Address,\n epochId: bigint | number,\n sequence: bigint | number\n ): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return await getProgramDerivedAddress({\n programAddress: this.programAddress,\n seeds: [\n Buffer.from(\"ASYNC_BURN_REQUEST\"),\n addressEncoder.encode(token),\n u64LeBytes(epochId),\n u64LeBytes(sequence),\n ],\n });\n }\n\n async deriveCpiPlanPda(\n uniqueId: Address,\n createdTs: bigint | number\n ): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return await getProgramDerivedAddress({\n programAddress: this.programAddress,\n seeds: [Buffer.from(\"cpi plan\"), addressEncoder.encode(uniqueId), u64LeBytes(createdTs)],\n });\n }\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport type { BN } from \"@anchor-lang/core\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n BaseIXBuilderService,\n accountExists,\n createSignerFromAddress,\n fromWeb3Pk,\n getCreateAtaIxIfNeeded,\n getWrapSolInstructions,\n mints,\n} from \"common\";\nimport type {\n LendingOperationCpiBundle,\n LendingOperationParams,\n RepayOperationParams,\n} from \"lending-platforms\";\n// Specific module, not the utils barrel — keeps the Kamino-heavy enrichment\n// graph out of the browser-safe `core` entry (see src/core.ts).\nimport { mergeLycLookupTables } from \"../../utils/lookupTables\";\nimport type { TokenAccountData, TokenLendingPositionData } from \"../../models/lycToken\";\nimport type { YieldingBankAccountData } from \"../../models/yieldingBank\";\nimport {\n CIRCUIT_BREAKER_CONTROLLER,\n MANAGER,\n PROGRAM_ID,\n PROTOCOL_ADMIN,\n PROTOCOL_FEE_WALLET,\n} from \"../../constants/general\";\nimport type { LongYieldCarryBuilderContext } from \"../types/builders\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\n\nexport abstract class LongYieldCarryBuilderBase<\n TIxArgs,\n TTxArgs = TIxArgs,\n TTxResult = LongYieldCarryTransactionPlan,\n> extends BaseIXBuilderService<LongYieldCarryBuilderContext, TIxArgs, TTxArgs, TTxResult> {\n protected get rpc() {\n return this.context.rpc;\n }\n\n protected get program() {\n return this.context.program;\n }\n\n protected get account() {\n return this.context.account;\n }\n\n protected get pda() {\n return this.context.pda;\n }\n\n protected get swap() {\n return this.context.swap;\n }\n\n protected get externalLiquidityResolver() {\n return this.context.externalLiquidityResolver;\n }\n\n protected get environment() {\n return this.context.environment;\n }\n\n protected get lendingPlatformClients() {\n return this.context.lendingPlatformClients;\n }\n\n /**\n * Environment-level manager fallback. Use {@link resolveTokenManager} /\n * {@link resolveYieldingBankManager} whenever a specific token/bank's role\n * might override the default.\n */\n private get manager() {\n return MANAGER[this.environment];\n }\n\n /**\n * Environment-level circuit-breaker-controller fallback. Use\n * {@link resolveTokenCbController} / {@link resolveYieldingBankCbController}\n * whenever a specific token/bank's role might override the default.\n */\n private get circuitBreakerController() {\n return CIRCUIT_BREAKER_CONTROLLER[this.environment];\n }\n\n /**\n * Program-level admin. Also doubles as the environment-level fallback for\n * `TokenRoles::admin()` / `YieldingBankRoles::admin()` when their stored role\n * is unset — both Rust fallbacks resolve to this same pubkey by design.\n */\n private get protocolAdmin() {\n return PROTOCOL_ADMIN[this.environment];\n }\n\n /**\n * Program-level fee wallet. Also doubles as the fallback for\n * `TokenRoles::curator_fee_wallet()` when a token's `roles.fees` is unset —\n * the Rust `curator_fee_wallet()` getter delegates to `protocol_fee_wallet()`.\n */\n protected get protocolFeeWallet() {\n return PROTOCOL_FEE_WALLET[this.environment];\n }\n\n /** Program ID for this environment — used as the \"no-change\"/\"use-default\" sentinel on role accounts. */\n protected get programId() {\n return PROGRAM_ID[this.environment];\n }\n\n /**\n * Return the on-chain role key if it's set, otherwise the environment\n * fallback. Mirrors the Rust role getter pattern (`if self.role != default()\n * { self.role } else { <env default> }`).\n */\n private resolveStoredOrFallback(stored: PublicKey, fallback: Address): Address {\n return stored.equals(PublicKey.default) ? fallback : fromWeb3Pk(stored);\n }\n\n protected resolveTokenAdmin(tokenData: TokenAccountData): Address {\n return this.resolveStoredOrFallback(tokenData.roles.admin, this.protocolAdmin);\n }\n\n protected resolveTokenManager(tokenData: TokenAccountData): Address {\n return this.resolveStoredOrFallback(tokenData.roles.manager, this.manager);\n }\n\n protected resolveTokenCuratorFeeWallet(tokenData: TokenAccountData): Address {\n return this.resolveStoredOrFallback(tokenData.roles.fees, this.protocolFeeWallet);\n }\n\n protected resolveTokenCbController(tokenData: TokenAccountData): Address {\n return this.resolveStoredOrFallback(\n tokenData.roles.cbController,\n this.circuitBreakerController\n );\n }\n\n /**\n * Optional composite collateral oracle (e.g. SPL stake pool for PythSplStake).\n * Anchor optional accounts must be passed as `null` when unset.\n */\n protected resolveOptionalSecondaryCollateralOracle(\n collateral: TokenAccountData[\"collateral\"]\n ): Address | null {\n return collateral.secondaryOracle.equals(PublicKey.default)\n ? null\n : fromWeb3Pk(collateral.secondaryOracle);\n }\n\n protected resolveYieldingBankAdmin(bankData: YieldingBankAccountData): Address {\n return this.resolveStoredOrFallback(bankData.roles.admin, this.protocolAdmin);\n }\n\n protected resolveYieldingBankManager(bankData: YieldingBankAccountData): Address {\n return this.resolveStoredOrFallback(bankData.roles.manager, this.manager);\n }\n\n protected resolveYieldingBankCbController(bankData: YieldingBankAccountData): Address {\n return this.resolveStoredOrFallback(bankData.roles.cbController, this.circuitBreakerController);\n }\n\n protected getTxLookupTables(\n tokenPda?: Address | readonly Address[],\n existingLookupTables?: readonly Address[]\n ): Address[] {\n return mergeLycLookupTables(this.context.environment, tokenPda, existingLookupTables);\n }\n\n protected getLendingPlatformClient(position: TokenLendingPositionData) {\n return this.lendingPlatformClients.getForPosition(position);\n }\n\n protected async getCreateUserCollateralAtaIxIfNeeded(\n owner: Address,\n collateralMint: Address,\n collateralTokenProgram: Address\n ) {\n return getCreateAtaIxIfNeeded(this.rpc, owner, collateralMint, owner, collateralTokenProgram, {\n accountClient: this.account,\n });\n }\n\n protected async getWrapSolInstructionsIfMintIsSol(\n owner: Address,\n mint: Address,\n lamports: BN\n ): Promise<{\n instructions?: Instruction[];\n postSuccessCacheInvalidations?: LongYieldCarryTransactionPlan[\"postSuccessCacheInvalidations\"];\n }> {\n const solMint = mints.get(\"SOL\");\n if (!solMint || mint !== solMint.address) {\n return {};\n }\n\n const wrap = await getWrapSolInstructions(\n this.rpc,\n owner,\n createSignerFromAddress(owner),\n lamports,\n { accountClient: this.account }\n );\n return {\n instructions: wrap.instructions,\n postSuccessCacheInvalidations: wrap.postSuccessCacheInvalidations,\n };\n }\n\n protected async getLendingOperationCpiData(\n token: Address,\n manager: Address,\n position: TokenLendingPositionData,\n txId: string,\n operation: \"deposit\" | \"withdraw\" | \"borrow\" | \"repay\",\n uiAmount?: number | \"all\"\n ): Promise<LendingOperationCpiBundle> {\n const lpClient = this.getLendingPlatformClient(position);\n const pool = fromWeb3Pk(position.pool);\n const userAccount = fromWeb3Pk(position.protocolUserAcc);\n const reserve =\n operation === \"deposit\" || operation === \"withdraw\"\n ? fromWeb3Pk(position.collateralReserve)\n : fromWeb3Pk(position.debtReserve);\n\n const operationParams = {\n user: token,\n payer: manager,\n pool,\n reserve,\n userAccount,\n uiAmount,\n txId,\n } satisfies LendingOperationParams;\n\n if (operation === \"deposit\") {\n return lpClient.ix.getDepositCpiBundle(operationParams);\n }\n\n if (operation === \"borrow\") {\n const needsInit = !(await accountExists(this.rpc, userAccount));\n return needsInit\n ? lpClient.ix.getInitBorrowPositionCpiBundle(\n operationParams,\n fromWeb3Pk(position.collateralReserve)\n )\n : lpClient.ix.getBorrowCpiBundle(operationParams);\n }\n\n if (operation === \"withdraw\") {\n return lpClient.ix.getWithdrawCpiBundle(operationParams);\n }\n\n if (uiAmount === \"all\") {\n throw new Error('The \"all\" amount sentinel is only valid for withdrawals');\n }\n const repayParams: RepayOperationParams = { ...operationParams, uiAmount };\n return lpClient.ix.getRepayCpiBundle(repayParams);\n }\n}\n\nexport abstract class LongYieldCarrySingleInstructionBuilderService<\n TIxArgs,\n TTxArgs = TIxArgs,\n TTxPlan extends LongYieldCarryTransactionPlan = LongYieldCarryTransactionPlan,\n> extends LongYieldCarryBuilderBase<TIxArgs, TTxArgs, TTxPlan> {\n protected async deriveIxArgs(txArgs: TTxArgs): Promise<TIxArgs> {\n return txArgs as unknown as TIxArgs;\n }\n\n protected async buildPreambleInstructions(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<Instruction[]> {\n return [];\n }\n\n protected async buildLookupTables(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<readonly Address[] | undefined> {\n return undefined;\n }\n\n protected async buildPlanExtras(\n _args: TIxArgs,\n _txArgs: TTxArgs\n ): Promise<Omit<TTxPlan, \"instructions\" | \"lookupTables\"> | undefined> {\n return undefined;\n }\n\n async getTx(txArgs: TTxArgs): Promise<TTxPlan> {\n const args = await this.deriveIxArgs(txArgs);\n const preambleInstructions = await this.buildPreambleInstructions(args, txArgs);\n const instruction = await this.getIx(args);\n const lookupTables = await this.buildLookupTables(args, txArgs);\n const extras = await this.buildPlanExtras(args, txArgs);\n\n return {\n instructions: [...preambleInstructions, instruction],\n ...(lookupTables?.length ? { lookupTables: [...lookupTables] } : {}),\n ...(extras ?? {}),\n } as TTxPlan;\n }\n}\n","import { type Address, Rpc, SolanaRpcApi, TransactionSigner } from \"@solana/kit\";\nimport { ADDRESS_LOOKUP_TABLE_PROGRAM_ADDRESS } from \"@solana-program/address-lookup-table\";\nimport { COMPUTE_BUDGET_PROGRAM_ADDRESS } from \"@solana-program/compute-budget\";\nimport { SYSTEM_PROGRAM_ADDRESS } from \"@solana-program/system\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport {\n DEFAULT_PUBLIC_KEY,\n dedupeOrderedAddresses,\n type DeployedEnv,\n type Environment,\n JITO_TIP_ACCOUNTS,\n LendingPlatform,\n type MintIdentifier,\n fromWeb3Pk,\n getAtaAddress,\n getRpcUrl,\n lendingPlatformToEnum,\n lutManager,\n mints,\n resolveTokenProgram,\n} from \"common\";\nimport { oracle } from \"oracle\";\nimport {\n getGeneralLookupTableAccountsForPerena,\n PERENA_PROGRAM_ID,\n PerenaClient,\n} from \"perena-helpers\";\nimport { LongYieldCarryClient } from \"../client/client\";\nimport { LYCToken } from \"../models/lycToken\";\nimport { GENERAL_LOOKUP_TABLES, MANAGER, PROGRAM_ID } from \"../constants/general\";\nimport { TOKEN_LOOKUP_TABLES } from \"../constants\";\n\n/**\n * Oracle account when {@link oracle} can resolve Pyth, Switchboard, or a custom feed.\n * Not exported — module-local helper (TypeScript has no `private` on file-level functions).\n */\nfunction tryOracleAddress(mint: MintIdentifier): Address | undefined {\n try {\n return oracle.getOracleData(mint).oracle;\n } catch {\n return undefined;\n }\n}\n\n/** Registry stablecoins + YBAs — used for yielding-bank ATA derivation. */\nconst DEBT_AND_YBA_MINT_INFOS = [...mints.stablecoins(), ...mints.yieldBearingAssets()];\n\n/** Registry Standard + LST mints — risk / collateral-style assets (oracle-only on general LUT). */\nconst RISK_ASSET_MINT_INFOS = [\n ...mints.filterAssetsByType(\"Standard\"),\n ...mints.filterAssetsByType(\"LST\"),\n];\n\n/**\n * Stablecoin + YBA mints with registry oracles for the general LUT.\n * Risk assets (Standard + LST registry entries): oracle only — mints stay on each token's LUT via on-chain collateral.\n * Not exported — module-local helper.\n */\nfunction getMintRegistryAccountsForGeneralLut(): Address[] {\n const out: Address[] = [];\n for (const m of DEBT_AND_YBA_MINT_INFOS) {\n out.push(m.address);\n const o = tryOracleAddress(m.address);\n if (o) {\n out.push(o);\n }\n }\n for (const m of RISK_ASSET_MINT_INFOS) {\n const o = tryOracleAddress(m.address);\n if (o) {\n out.push(o);\n }\n }\n return out;\n}\n\n/**\n * Every YieldingBank PDA plus, for each bank, the ATA for each registry stablecoin and YBA mint.\n * Not exported — module-local helper.\n */\nasync function getYieldingBankAccountsForGeneralLut(\n client: LongYieldCarryClient\n): Promise<Address[]> {\n const banks = await client.account.fetchAllYieldingBanks();\n const out: Address[] = [];\n\n for (const b of banks) {\n out.push(b.address);\n for (const m of DEBT_AND_YBA_MINT_INFOS) {\n out.push(await getAtaAddress(m.address, b.address, m.tokenProgram));\n }\n }\n return out;\n}\n\n/**\n * Get the specific lookup table for the given Token PDA (if it exists).\n *\n * `TOKEN_LOOKUP_TABLES` is keyed by Token PDA address.\n */\nexport function getLookupTableForToken(tokenPda: Address) {\n if (tokenPda in TOKEN_LOOKUP_TABLES) {\n return TOKEN_LOOKUP_TABLES[tokenPda];\n }\n}\n\n/**\n * Assembles lookup table addresses for LYC transaction plans: the deployment\n * general LUT (when not `local`), any registered per-token LUT for the given\n * token PDAs, then any CPI/swap tables. Entries are omitted when missing or\n * equal to the default (unused) public key; duplicates are removed in first-seen\n * order.\n */\nexport function mergeLycLookupTables(\n environment: Environment,\n tokenPda?: Address | readonly Address[],\n existingLookupTables?: readonly Address[]\n): Address[] {\n const all: (Address | undefined)[] = [];\n\n if (environment !== \"local\") {\n all.push(GENERAL_LOOKUP_TABLES[environment as DeployedEnv]);\n }\n\n if (tokenPda !== undefined) {\n for (const t of Array.isArray(tokenPda) ? tokenPda : [tokenPda]) {\n all.push(getLookupTableForToken(t));\n }\n }\n\n if (existingLookupTables) {\n all.push(...existingLookupTables);\n }\n\n const valid = all.filter((a): a is Address => a !== undefined && a !== DEFAULT_PUBLIC_KEY);\n return [...new Set(valid)];\n}\n\n/**\n * Refresh per-token lookup tables for every Token account owned by the program.\n *\n * @param client - Initialized client (provides RPC-backed account fetch and Kamino helpers).\n */\nexport async function updateTokenLutsIfNeeded(\n signer: TransactionSigner,\n rpc: Rpc<SolanaRpcApi>,\n client: LongYieldCarryClient\n) {\n const tokens = await client.account.fetchAllTokens();\n for (const t of tokens) {\n await updateTokenLutIfNeeded(signer, rpc, client, t);\n }\n}\n\n/**\n * Extend the per-token lookup table with addresses needed for that token's\n * instructions: mints, token/YB ATAs, registry debt-mint ATAs for the token PDA, lending protocol accounts, Kamino\n * obligation ATAs when applicable. Lending reserve accounts live on the\n * lending-platform LUT; price oracles for registry-listed debt/YBAs and risk\n * assets live on the general LUT.\n *\n * Collateral mint is read from on-chain token state (it is not a PDA).\n *\n * @param client - Used for Kamino reserve metadata and reserve interaction ATAs.\n * @param token - Fetched token model (`LYCToken`); avoids an extra fetch.\n */\nexport async function updateTokenLutIfNeeded(\n signer: TransactionSigner,\n rpc: Rpc<SolanaRpcApi>,\n client: LongYieldCarryClient,\n token: LYCToken\n) {\n const kaminoClient = client.getLendingPlatformClientByPlatform(LendingPlatform.Kamino);\n const allAccounts: Address[] = [];\n\n const tokenPda = token.address;\n const yMint = token.mint;\n const collateralMint = token.collateralMint;\n const collateralTp = resolveTokenProgram(token.data.collateral.tokenProgram);\n const yTokenTp = resolveTokenProgram(token.data.config.tokenProgram);\n\n allAccounts.push(tokenPda, yMint, collateralMint);\n allAccounts.push(\n await getAtaAddress(collateralMint, tokenPda, collateralTp),\n await getAtaAddress(yMint, tokenPda, yTokenTp)\n );\n\n for (const m of mints.stablecoins()) {\n allAccounts.push(await getAtaAddress(m.address, tokenPda, m.tokenProgram));\n }\n\n for (const position of token.data.lendingPositions) {\n const platform = lendingPlatformToEnum(position.platform);\n if (platform === LendingPlatform.None) {\n continue;\n }\n\n allAccounts.push(fromWeb3Pk(position.protocolUserAcc));\n\n const debtMint = fromWeb3Pk(position.accounting.debt.mint);\n const debtTp = resolveTokenProgram(position.accounting.debt.tokenProgram);\n allAccounts.push(await getAtaAddress(debtMint, tokenPda, debtTp));\n\n if (platform === LendingPlatform.Kamino) {\n const pool = fromWeb3Pk(position.pool);\n const userAcc = fromWeb3Pk(position.protocolUserAcc);\n for (const reserve of [\n fromWeb3Pk(position.collateralReserve),\n fromWeb3Pk(position.debtReserve),\n ]) {\n const details = await kaminoClient.accounts.reserveInteractionDetails(\n tokenPda,\n pool,\n reserve,\n userAcc\n );\n allAccounts.push(\n details.userLiquidityTa.address,\n details.userCollateralTa.address,\n userAcc\n );\n\n const userFarmAddresses = await kaminoClient.accounts.getUserFarmAddresses(\n pool,\n reserve,\n userAcc\n );\n allAccounts.push(...userFarmAddresses);\n }\n }\n }\n\n console.log(\"Updating token LUT for token:\", tokenPda);\n lutManager.clearCache();\n await lutManager.updateLookupTable(signer, rpc, allAccounts, getLookupTableForToken(tokenPda));\n}\n\n/**\n * Extend the shared general lookup table: program IDs, well-known SPL programs,\n * stablecoin and YBA mints (plus registry oracles), Standard + LST oracle accounts,\n * Perena program id, every on-chain YieldingBank PDA, each bank’s ATAs for\n * all registry debt mints (stablecoins) and yield-bearing assets, the canonical\n * Jito tip accounts (referenced by every Jito-bundle tip ix), the ComputeBudget\n * program (referenced by every CU-limit ix), and the deployment's manager.\n *\n * Risk asset (Standard + LST) mints are omitted here; they appear on each token LUT\n * as collateral.\n *\n * Uses {@link GENERAL_LOOKUP_TABLES} for {@link LongYieldCarryClient.environment}\n * (`test` | `prod` only) and only that tier’s program ID.\n *\n * @throws If `client.environment` is `local` — there is no pinned general LUT for local.\n */\nexport async function updateGeneralLutIfNeeded(\n signer: TransactionSigner,\n rpc: Rpc<SolanaRpcApi>,\n client: LongYieldCarryClient\n): Promise<Address> {\n const deployedEnv = client.environment;\n\n if (deployedEnv === \"local\") {\n throw new Error(\n \"updateGeneralLutIfNeeded requires LongYieldCarryClient built with test or prod; local has no GENERAL_LOOKUP_TABLES entry.\"\n );\n }\n\n const registryAccounts = getMintRegistryAccountsForGeneralLut();\n const yieldingBankAccounts = await getYieldingBankAccountsForGeneralLut(client);\n const perenaAccounts = await getGeneralLookupTableAccountsForPerena(\n new PerenaClient(getRpcUrl(deployedEnv))\n );\n\n const allAccounts: Address[] = [\n PROGRAM_ID[deployedEnv],\n SYSTEM_PROGRAM_ADDRESS,\n TOKEN_PROGRAM_ADDRESS,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n TOKEN_2022_PROGRAM_ADDRESS,\n COMPUTE_BUDGET_PROGRAM_ADDRESS,\n DEFAULT_PUBLIC_KEY,\n ADDRESS_LOOKUP_TABLE_PROGRAM_ADDRESS,\n PERENA_PROGRAM_ID,\n MANAGER[deployedEnv],\n ...JITO_TIP_ACCOUNTS,\n ...registryAccounts,\n ...perenaAccounts,\n ...yieldingBankAccounts,\n ];\n\n lutManager.clearCache();\n return lutManager.updateLookupTable(\n signer,\n rpc,\n dedupeOrderedAddresses(allAccounts),\n GENERAL_LOOKUP_TABLES[deployedEnv]\n );\n}\n","import { address } from \"@solana/kit\";\nimport {\n mints as mintRegistry,\n OracleType,\n getRpcUrl,\n ENVIRONMENT,\n findKeyIgnoreCase,\n type Environment,\n type MintIdentifier,\n} from \"common\";\nimport { PYTH_FEEDS } from \"./constants/pyth\";\nimport { SWITCHBOARD_PRICE_FEED_IDS } from \"./constants/switchboard\";\nimport { JupiterPrices } from \"./feeds/jupiter\";\nimport { PythPrices } from \"./feeds/pyth\";\nimport { SwitchboardPrices } from \"./feeds/switchboard\";\nimport { CustomOracle, CustomPrices } from \"./feeds/custom\";\nimport { type PriceResult } from \"./types\";\nimport { registerUsdStarOracle, registerUsdStarJuniorOracle, registerDfdvSolOracle } from \"./utils\";\n\nexport class OracleService {\n private jupiter: JupiterPrices;\n private pyth: PythPrices;\n private switchboard: SwitchboardPrices;\n private custom: CustomPrices;\n\n constructor() {\n this.jupiter = new JupiterPrices();\n this.pyth = new PythPrices();\n this.switchboard = new SwitchboardPrices();\n this.custom = new CustomPrices();\n }\n\n /**\n * Register a custom oracle for a given mint.\n * Custom-registered mints take priority over all other oracle sources.\n */\n registerCustomOracle(mint: MintIdentifier, oracle: CustomOracle): void {\n this.custom.registerCustomOracle(mint, oracle);\n }\n\n getOracleData(mint: MintIdentifier) {\n const customOracle = this.custom.getCustomOracle(mint);\n if (customOracle) {\n return {\n oracle: customOracle.oracle,\n oracleType: customOracle.oracleType,\n secondaryOracle: customOracle.secondaryOracle,\n };\n }\n\n const symbol = mintRegistry.get(mint)?.symbol;\n const pythSymbol = symbol ? findKeyIgnoreCase(PYTH_FEEDS, symbol) : undefined;\n const switchboardSymbol = symbol\n ? findKeyIgnoreCase(SWITCHBOARD_PRICE_FEED_IDS, symbol)\n : undefined;\n\n return {\n oracle: pythSymbol\n ? PYTH_FEEDS[pythSymbol].account\n : address(SWITCHBOARD_PRICE_FEED_IDS[switchboardSymbol!].feedId),\n oracleType: pythSymbol ? OracleType.Pyth : OracleType.Switchboard,\n secondaryOracle: undefined,\n };\n }\n\n clearCache(): void {\n this.jupiter.dataCache.clearAllCache();\n this.pyth.dataCache.clearAllCache();\n this.switchboard.dataCache.clearAllCache();\n this.custom.dataCache.clearAllCache();\n }\n\n async fetchPrices(\n mints: MintIdentifier[],\n mode?: \"realtime\" | \"ema\",\n bypassCache?: boolean,\n environment: Environment = ENVIRONMENT\n ): Promise<Record<MintIdentifier, number>> {\n if (!mints.length) {\n return {};\n }\n\n const rpcUrl = getRpcUrl(environment);\n\n const customMints: MintIdentifier[] = [];\n const pythMints: MintIdentifier[] = [];\n const switchboardMints: MintIdentifier[] = [];\n const jupiterMints: MintIdentifier[] = [];\n\n for (const mint of mints) {\n if (this.custom.hasCustomOracle(mint)) {\n customMints.push(mint);\n } else {\n const symbol = mintRegistry.get(mint)?.symbol;\n if (symbol && findKeyIgnoreCase(PYTH_FEEDS, symbol)) {\n pythMints.push(mint);\n } else if (symbol && findKeyIgnoreCase(SWITCHBOARD_PRICE_FEED_IDS, symbol)) {\n switchboardMints.push(mint);\n } else {\n jupiterMints.push(mint);\n }\n }\n }\n\n const [customPrices, pythPrices, switchboardPrices, jupiterPrices] = await Promise.all([\n customMints.length ? this.custom.fetchPrices(customMints, bypassCache, { rpcUrl }) : {},\n pythMints.length ? this.pyth.fetchPrices(pythMints, bypassCache) : {},\n switchboardMints.length ? this.switchboard.fetchPrices(switchboardMints, bypassCache) : {},\n jupiterMints.length ? this.jupiter.fetchPrices(jupiterMints, bypassCache) : {},\n ]);\n\n const toNumber = (result: PriceResult): number =>\n mode === \"realtime\" ? result.realtimePrice : (result.emaPrice ?? result.realtimePrice);\n\n const prices: Record<MintIdentifier, number> = {};\n for (const mint of mints) {\n const price = toNumber(\n (customPrices as Record<MintIdentifier, PriceResult>)[mint] ??\n (pythPrices as Record<MintIdentifier, PriceResult>)[mint] ??\n (switchboardPrices as Record<MintIdentifier, PriceResult>)[mint] ??\n (jupiterPrices as Record<MintIdentifier, PriceResult>)[mint]\n );\n const isStablecoin = mintRegistry.get(mint)?.assetType === \"Stablecoin\";\n prices[mint] = isStablecoin ? Math.min(price, 1) : price;\n }\n\n return prices;\n }\n}\n\nexport const oracle = new OracleService();\n\nregisterUsdStarOracle(oracle);\nregisterUsdStarJuniorOracle(oracle);\nregisterDfdvSolOracle(oracle);\n","import { address, Address } from \"@solana/kit\";\nimport { MintIdentifier } from \"common\";\n\nexport interface PythFeed {\n account: Address;\n feedId: string;\n}\n\n// https://docs.pyth.network/price-feeds/core/push-feeds/solana\nexport const PYTH_FEEDS: Record<MintIdentifier, PythFeed> = {\n // Standard assets\n SOL: {\n account: address(\"7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE\"),\n feedId: \"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d\",\n },\n WETH: {\n account: address(\"42amVS4KgzR9rA28tkVYqVXjq9Qa8dcZQMbH5EYFX6XC\"),\n feedId: \"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace\",\n },\n WBTC: {\n account: address(\"9gNX5vguzarZZPjTnE1hWze3s6UsZ7dsU3UnAmKPnMHG\"),\n feedId: \"c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33\",\n },\n CBBTC: {\n account: address(\"4cSM2e6rvbGQUFiJbqytoVMi5GgghSMr8LwVrT9VPSPo\"),\n feedId: \"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43\",\n },\n JLP: {\n account: address(\"2TTGSRSezqFzeLUH8JwRUbtN66XLLaymfYsWRTMjfiMw\"),\n feedId: \"c811abc82b4bad1f9bd711a2773ccaa935b03ecef974236942cec5e0eb845a3a\",\n },\n SPYx: {\n account: address(\"9owhtgrdLiUMAH9JKxYFt5pUY4Luy4EzzLhdcWPVuDyy\"),\n feedId: \"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9509f68afa5c4c11cd5\",\n },\n QQQx: {\n account: address(\"EwssJrQ7UVz6itHEaQQsKWikhZ3iHddyxRhmR7pTvwt5\"),\n feedId: \"9695e2b96ea7b3859da9ed25b7a46a920a776e2fdae19a7bcfdf2b219230452d\",\n },\n // LSTs\n JupSOL: {\n account: address(\"D7UqeBmCEmhGXGYfi2y9RfoCa7t1Xw5iZLBeYZ3sxFSe\"),\n feedId: \"f8d8d6b6c866c8b2624fb5b679ae846738725e5fc887fa8e927c8d8645018a2b\",\n },\n // Stablecoins\n USDC: {\n account: address(\"Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX\"),\n feedId: \"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a\",\n },\n USDT: {\n account: address(\"HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM\"),\n feedId: \"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b\",\n },\n CASH: {\n account: address(\"F23Xi7VQw1pdre26VmuKnjRcDcrhpqGtHkGdKdSdbM8w\"),\n feedId: \"df3320ef0f4617337b8dbb924f2aaa4f9db08f522a5435b44f9066c1ac4c7f95\",\n },\n PYUSD: {\n account: address(\"9zXQxpYH3kYhtoybmZfUNNCRVuud7fY9jswTg1hLyT8k\"),\n feedId: \"0xc1da1b73d7f01e7ddd54b3766cf7fcd644395ad14f70aa706ec5384c59e76692\",\n },\n USDG: {\n account: address(\"6JkZmXGgWnzsyTQaqRARzP64iFYnpMNT4siiuUDUaB8s\"),\n feedId: \"0xdaa58c6a3ce7d4b9c46c32a6e646012c17c4a2b24c08dd8c5e476118b855a7da\",\n },\n USDS: {\n account: address(\"DyYBBWEi9xZvgNAeMDCiFnmC1U9gqgVsJDXkL5WETpoX\"),\n feedId: \"0x77f0971af11cc8bac224917275c1bf55f2319ed5c654a1ca955c82fa2d297ea1\",\n },\n // Yield bearing assets\n PST: {\n account: address(\"CBGwQddTeYn3KdvxGWtU95fqCcavzHK9XPFBLENDF5JR\"),\n feedId: \"675e36f84a6be779ed793c71eb5c03151e1866c125767f46933626e0610af84d\",\n },\n};\n","import { MintIdentifier } from \"common\";\n\ninterface SwitchboardFeed {\n feedId: string;\n feedHash: string;\n}\n\n// https://beta.ondemand.switchboard.xyz/solana/mainnet\nexport const SWITCHBOARD_PRICE_FEED_IDS: Record<MintIdentifier, SwitchboardFeed> = {\n SOL: {\n feedId: \"4Hmd6PdjVA9auCoScE12iaBogfwS4ZXQ6VZoBeqanwWW\",\n feedHash: \"0x1f42dfb21efb24828b99fbe70e6d139cd665aafcbb1706bccd8f2a9b12562db6\",\n },\n};\n","import { Address } from \"@solana/kit\";\nimport { getBatches } from \"common\";\nimport { retry } from \"ts-retry\";\nimport { PriceBase, type PriceFetchContext } from \"./priceBase\";\nimport { PriceResult } from \"../types\";\n\nexport class JupiterPrices extends PriceBase {\n private async getJupPriceData(mints: Address[]) {\n const batches = getBatches(mints, 50);\n\n const results = await Promise.all(\n batches.map((batch) =>\n retry(\n async () => {\n const res = await (\n await fetch(\n \"https://lite-api.jup.ag/price/v3?ids=\" + batch.map((x) => x.toString()).join(\",\")\n )\n ).json();\n\n if (!res || typeof res !== \"object\") {\n throw new Error(\"Failed to get mint prices using Jupiter\");\n }\n\n return res;\n },\n { maxTry: 6, delay: 250 }\n )\n )\n );\n\n return Object.assign({}, ...results);\n }\n\n async internalFetchPrices(\n mints: Address[],\n _context?: PriceFetchContext\n ): Promise<Record<Address, PriceResult>> {\n if (mints.length == 0) {\n return {};\n }\n\n const priceData = await this.getJupPriceData(mints);\n const sortedPrices: { [key: string]: any } = {};\n\n for (const mint of mints) {\n const key = mint.toString();\n if (priceData.hasOwnProperty(key)) {\n sortedPrices[key] = priceData[key];\n }\n }\n\n const prices: Record<string, PriceResult> = Object.fromEntries(\n mints.map((mint) => [\n mint,\n sortedPrices !== null &&\n typeof sortedPrices === \"object\" &&\n typeof sortedPrices[mint.toString()] === \"object\" &&\n \"usdPrice\" in sortedPrices[mint.toString()]\n ? { realtimePrice: parseFloat(sortedPrices[mint.toString()].usdPrice as string) }\n : { realtimePrice: 0 },\n ])\n );\n\n return prices;\n }\n}\n","import { DataCache, MintIdentifier, PRICE_STALENESS_SECONDS } from \"common\";\nimport { PriceResult } from \"../types\";\n\n/** Optional per-fetch context passed through {@link PriceBase.fetchPrices}. */\nexport interface PriceFetchContext {\n /** RPC URL for feeds that need on-chain reads (e.g. custom SPL-stake oracles). */\n rpcUrl?: string;\n}\n\nexport abstract class PriceBase {\n dataCache!: DataCache;\n\n constructor() {\n this.dataCache = new DataCache({\n defaultTtlMs: PRICE_STALENESS_SECONDS * 1000,\n });\n }\n\n protected abstract internalFetchPrices(\n mints: MintIdentifier[],\n context?: PriceFetchContext\n ): Promise<Record<MintIdentifier, PriceResult>>;\n\n public async fetchPrices(\n mints: MintIdentifier[],\n bypassCache?: boolean,\n context?: PriceFetchContext\n ): Promise<Record<MintIdentifier, PriceResult>> {\n if (!mints.length) {\n return {};\n }\n\n if (bypassCache) {\n return await this.internalFetchPrices(mints, context);\n }\n\n const { data } = await this.dataCache.getDataBatch<PriceResult>(\n async () => {\n const prices = await this.internalFetchPrices(mints, context);\n return mints.map((mint) => prices[mint] ?? null);\n },\n \"prices\",\n mints\n );\n return Object.fromEntries(mints.map((mint, i) => [mint, data[i] ?? 0]));\n }\n}\n","import { address } from \"@solana/kit\";\n\n/** SPL stake pool account for dfdvSOL (DeFi Development Corp LST). */\nexport const DFDVSOL_STAKE_POOL = address(\"pyZMBjpWsVjKANAYK5mpNbKiws2krjRPZ2N2UYCSnbP\");\n","import { Address } from \"@solana/kit\";\nimport { PriceBase, type PriceFetchContext } from \"./priceBase\";\nimport { PYTH_FEEDS } from \"../constants\";\nimport {\n createRecord,\n findKeyIgnoreCase,\n fromUiAmount,\n mints as mintRegistry,\n toUiAmount,\n} from \"common\";\nimport { retry } from \"ts-retry\";\nimport { PriceResult } from \"../types\";\nimport { pythRequest } from \"../utils\";\n\nexport class PythPrices extends PriceBase {\n private deriveValue = (price: number, exponent: number) => {\n if (exponent > 0) {\n return Number(fromUiAmount(Number(price), exponent));\n } else if (exponent < 0) {\n return toUiAmount(BigInt(price), Math.abs(exponent));\n } else {\n return Number(price);\n }\n };\n\n private findFeed(symbol: string) {\n const key = findKeyIgnoreCase(PYTH_FEEDS, symbol);\n return key ? PYTH_FEEDS[key] : undefined;\n }\n\n protected async internalFetchPrices(\n mints: Address[],\n _context?: PriceFetchContext\n ): Promise<Record<Address, PriceResult>> {\n const feedIds = mints.map((mint) => {\n const symbol = mintRegistry.get(mint)?.symbol;\n const feed = symbol ? this.findFeed(symbol) : undefined;\n if (!feed) {\n throw new Error(`No Pyth feed configured for mint ${mint.toString()}`);\n }\n return feed.feedId;\n });\n\n const prices: PriceResult[] = await retry(\n async () => {\n const resp = await pythRequest(feedIds);\n const status = resp.status;\n if (status !== 200) {\n const body = await resp.text().catch(() => \"<failed to read response body>\");\n throw new Error(\n `Pyth price request failed status=${status} statusText=${resp.statusText} feedIds=${feedIds.join(\",\")} body=${body}`\n );\n }\n\n const json = await resp.json();\n const prices = (json as any).parsed.map((x: any) => {\n return {\n realtimePrice: this.deriveValue(x.price.price, x.price.expo),\n emaPrice: this.deriveValue(x.ema_price.price, x.ema_price.expo),\n };\n });\n\n return prices;\n },\n {\n maxTry: 5,\n delay: 250,\n }\n );\n\n return createRecord(\n mints.map((x) => x.toString()),\n prices\n );\n }\n}\n","import { address, type Address } from \"@solana/kit\";\n\n/**\n * Perena Bankineco Program ID (prod)\n */\nexport const PERENA_PROGRAM_ID: Address = address(\"save8RQVPMWNTzU18t3GBvBkN9hT7jsGjiCQ28FpD9H\");\n","import { BN } from \"@anchor-lang/core\";\nimport type { Address } from \"@solana/kit\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n UsdStarClient,\n BankinecoAction,\n type YieldingToBankMintQuoteRes,\n type BankMintToYieldingQuoteRes,\n type FetchUnstakeFeeRes,\n type TrancheCpiAccounts,\n type WithdrawalQueueEntry,\n} from \"@perena/bankineco-sdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { SYSTEM_PROGRAM_ADDRESS } from \"@solana-program/system\";\nimport { PERENA_PROGRAM_ID } from \"./constants\";\nimport {\n RoutableSwapClient,\n SwapQuoteParams,\n SwapQuote,\n SwapQuoteCoveringMinOutputParams,\n SwapInstructionOptions,\n CpiTypes,\n mints,\n toCustomAccountMeta,\n DataCache,\n type TransactionCacheInvalidation,\n type TokenProtocolClient,\n type TokenProtocolInfo,\n toCustomAccountMetaFromWeb3AccountMeta,\n CpiData,\n CustomAccountMeta,\n fromWeb3Pk,\n getAtaAddress,\n numToU64Bytes,\n} from \"common\";\nimport { getPerenaBurnArgs, getPerenaMintArgs, getPerenaRequestUnstakeArgs } from \"./cpi\";\n\nconst ACTIVE_WITHDRAWAL_QUEUES_CACHE_CATEGORY = \"activeWithdrawalQueues\";\n/**\n * Raw quote data from Perena SDK.\n *\n * Discriminated by `operation`:\n * - `mint`: yielding → USD* (e.g. USDC → USD*)\n * - `burn`: USD* → yielding (e.g. USD* → USDC)\n * - `stake`: USD* → USD*-J\n * - `unstake`: USD*-J → USD* or yielding (instant, single-tx)\n * - `request_unstake`: USD*-J → withdrawal queue (lockup period)\n * - `fulfill_unstake`: withdrawal queue → USD* or yielding (after lockup)\n */\nexport type PerenaRawQuote =\n | { operation: \"mint\"; yieldingMint: Address; sdkQuote: YieldingToBankMintQuoteRes }\n | { operation: \"burn\"; yieldingMint: Address; sdkQuote: BankMintToYieldingQuoteRes }\n | { operation: \"stake\" }\n | { operation: \"unstake\"; targetMint?: Address; unstakeFee: FetchUnstakeFeeRes }\n | {\n operation: \"request_unstake\";\n targetMint?: Address;\n unstakeFee: FetchUnstakeFeeRes;\n queueId: number;\n payer: Address;\n }\n | {\n operation: \"fulfill_unstake\";\n withdrawalQueue: Address;\n queuePayer: Address;\n owner: Address;\n targetMint?: Address;\n };\n\n/** Perena-specific swap quote with typed rawQuote */\nexport type PerenaSwapQuote = SwapQuote<PerenaRawQuote>;\n\n/** Parameters for building a request_unstake_junior CPI. */\nexport interface RequestUnstakeParams {\n /** Number of junior shares to lock */\n shares: BN | number;\n /** Queue slot id (0–255), unique per user per bank */\n queueId: number;\n /** Address that acts as the user/signer for the unstake */\n userPublicKey: Address;\n /** Address that pays rent for the withdrawal queue PDA (often same as user) */\n payer: Address;\n /** Optional yielding mint to receive upon fulfillment. Defaults to USD*. */\n targetMint?: Address;\n}\n\n/** Parameters for building a fulfill_unstake_junior CPI. */\nexport interface FulfillUnstakeParams {\n /** Address of the withdrawal queue PDA */\n withdrawalQueue: Address;\n /** The signer executing the fulfillment (queue owner or fulfiller) */\n signer: Address;\n /** The original payer who funded the queue rent (receives refund) */\n queuePayer: Address;\n /** The queue owner (needed to derive owner_bank_mint_ata) */\n owner: Address;\n /** Optional yielding mint — if the queue's target_mint is a yielding mint */\n targetMint?: Address;\n}\n\n/**\n * Perena USD* client implementing RoutableSwapClient and TokenProtocolClient.\n *\n * Provides a unified API for:\n * - Minting and burning USD*\n * - Querying protocol capabilities and info (YieldProtocolClient interface)\n *\n * @example\n * ```typescript\n * import { PerenaClient } from \"perena-helpers\";\n * import { defaultMints } from \"common/services/mints\";\n *\n * const client = new PerenaClient(rpcUrl);\n * const usdc = defaultMints.get(\"USDC\")!;\n * const usdStar = defaultMints.get(\"USD*\")!;\n *\n * // Mint: USDC → USD*\n * const mintQuote = await client.getQuote({\n * inputMint: usdc.address,\n * outputMint: usdStar.address,\n * amount: 10_000_000, // 10 USDC\n * slippageBps: 100,\n * });\n *\n * // Burn: USD* → USDC\n * const burnQuote = await client.getQuote({\n * inputMint: usdStar.address,\n * outputMint: usdc.address,\n * amount: 10_000_000, // 10 USD*\n * slippageBps: 100,\n * });\n *\n * // Get CPI accounts for instruction\n * const { accounts, programId } = await client.getSwapCpiData(\n * mintQuote,\n * userPda\n * );\n * ```\n */\nexport class PerenaClient implements RoutableSwapClient<PerenaRawQuote>, TokenProtocolClient {\n readonly sdkClient: UsdStarClient;\n private readonly cache: DataCache;\n\n /**\n * The bank mint (USD*).\n */\n public readonly bankMint: Address;\n\n /**\n * The junior tranche token (USD*-J).\n */\n public readonly juniorMint: Address;\n\n /**\n * Mints that can appear on either side of a Perena-routed swap (USD*, USD*-J,\n * and idle vault yielding mints). Same reference as {@link outputMints}.\n */\n public readonly inputMints: readonly Address[];\n\n /**\n * Same as {@link inputMints} — Perena routes are symmetric in terms of\n * allowed mints; {@link routeAnchorMints} encodes the “must touch USD* or USD*-J” rule.\n */\n public readonly outputMints: readonly Address[];\n\n /**\n * A valid route must involve at least one of USD* or USD*-J (prevents e.g. USDC↔USDT).\n */\n public readonly routeAnchorMints: readonly Address[];\n\n /**\n * Creates a new Perena client.\n *\n * @param rpcUrl - Solana RPC URL\n */\n constructor(rpcUrl: string) {\n this.sdkClient = UsdStarClient.new({\n env: \"prod\",\n rpcUrl,\n });\n this.cache = new DataCache({\n defaultTtlMs: 60_000 * 5, // 5 minute default\n });\n\n const usdStar = mints.get(\"USD*\");\n if (!usdStar) {\n throw new Error(\"USD* mint not found in registry\");\n }\n this.bankMint = usdStar.address;\n\n const usdStarJ = mints.get(\"USD*-J\");\n if (!usdStarJ) {\n throw new Error(\"USD*-J mint not found in registry\");\n }\n this.juniorMint = usdStarJ.address;\n\n const yieldingMints = Object.keys(this.sdkClient.idleVaultIndices) as Address[];\n const routable = Object.freeze<Address[]>([this.bankMint, this.juniorMint, ...yieldingMints]);\n this.inputMints = routable;\n this.outputMints = routable;\n this.routeAnchorMints = Object.freeze([this.bankMint, this.juniorMint]);\n }\n\n /**\n * Get mints that can directly mint USD*.\n */\n async getSupportedSourceMints(): Promise<Address[]> {\n return Object.keys(this.sdkClient.idleVaultIndices).map((key) => key as Address);\n }\n\n /**\n * Get current protocol info for a source mint.\n * @param sourceMint - The source mint to get info for (i.e. USDC, USDT, etc.)\n * @returns Protocol info including fees and limits\n * @throws Error if sourceMint is not supported by Perena\n */\n async getProtocolInfo(sourceMint: Address): Promise<TokenProtocolInfo> {\n const supportedSourceMints = await this.getSupportedSourceMints();\n if (!supportedSourceMints.includes(sourceMint)) {\n throw new Error(`Source mint ${sourceMint} is not supported by Perena`);\n }\n\n const { data } = await this.cache.getDataOrThrow<TokenProtocolInfo>(\n async () => {\n const vault = this.sdkClient.getVault(new PublicKey(sourceMint));\n const vaultInfo = await this.sdkClient.bankineco.pg.account.vaultGenState.fetch(vault);\n return {\n sourceMint,\n mintFeeBps: vaultInfo.config.mintingFeeBps,\n redemptionFeeBps: vaultInfo.config.burningFeeBps,\n depositLimit: BigInt(0),\n redemptionLimit: BigInt(vaultInfo.accounting.yieldingReserveAmount.toString()),\n };\n },\n \"yieldProtocolInfo\",\n sourceMint\n );\n\n return data;\n }\n\n /**\n * Get the latest USD* price in UI units (e.g. dollars).\n *\n * @returns The current bank mint price as a number\n */\n async getLatestBankMintUiPrice(): Promise<number> {\n const { data } = await this.cache.getDataOrThrow<number>(\n () => this.sdkClient.latestBankMintUiPrice(),\n \"bankMintUiPrice\",\n \"latest\"\n );\n\n return data;\n }\n\n /**\n * Get the latest USD*-J price in UI units (e.g. dollars).\n *\n * @returns The current junior mint price as a number\n */\n async getLatestJuniorMintUiPrice(): Promise<number> {\n const { data } = await this.cache.getDataOrThrow<number>(\n () => this.sdkClient.latestJuniorMintUiPrice(),\n \"juniorMintUiPrice\",\n \"latest\"\n );\n\n return data;\n }\n\n /**\n * Size a USD* burn so the routed yielding output (e.g. USDC) is at least\n * `minYieldingOut` base units, without scanning inputs.\n *\n * Perena's `bankMintToYieldingQuote` is linear in the burn amount for fixed\n * oracles: bank-mint price, yielding price, burn fee bps, and decimal\n * rescales are all proportional in `amountToBurn`. We take **one** reference\n * quote at exactly 1.0 bank-mint token (10^decimals base units) to read the\n * effective `yieldingOut / bankMintIn` rate implied by the current prices,\n * then `ceil(need * refIn / refOut)` and re-quote once at that input so the\n * returned {@link PerenaSwapQuote} matches the CPI.\n */\n /**\n * @deprecated Prefer {@link getQuoteCoveringMinOutput} — same behavior with generic param names.\n */\n async getQuoteCoveringYieldingOut(params: {\n inputMint: Address;\n outputMint: Address;\n minYieldingOut: bigint;\n maxBankMintIn: bigint;\n slippageBps?: number;\n }): Promise<PerenaSwapQuote> {\n return this.getQuoteCoveringMinOutput({\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n minOutputAmount: params.minYieldingOut,\n maxInputAmount: params.maxBankMintIn,\n slippageBps: params.slippageBps,\n });\n }\n\n async getQuoteCoveringMinOutput(\n params: SwapQuoteCoveringMinOutputParams\n ): Promise<PerenaSwapQuote> {\n if (params.inputMint !== this.bankMint) {\n throw new Error(\"getQuoteCoveringMinOutput only supports burning USD* into a yielding mint\");\n }\n const need = params.minOutputAmount;\n if (need <= BigInt(0)) {\n throw new Error(\"getQuoteCoveringMinOutput: minOutputAmount must be positive\");\n }\n const maxIn = params.maxInputAmount;\n if (maxIn <= BigInt(0)) {\n throw new Error(\"getQuoteCoveringMinOutput: maxInputAmount must be positive\");\n }\n\n const vault = this.sdkClient.getVault(new PublicKey(params.outputMint));\n const refInBn = mints.get(\"USD*\")!.fromUiAmount(1);\n const oneBankMint = BigInt(refInBn.toString());\n const refSdk = await this.sdkClient.bankMintToYieldingQuote(refInBn, vault);\n const refOut = BigInt(refSdk.amount.toString());\n if (refOut === BigInt(0)) {\n throw new Error(\"Perena reference burn quote returned zero yielding output\");\n }\n\n const maxSdk = await this.sdkClient.bankMintToYieldingQuote(new BN(maxIn.toString()), vault);\n if (BigInt(maxSdk.amount.toString()) < need) {\n throw new Error(\n \"Perena: bank mint holding cannot cover the yielding output required for this unwind\"\n );\n }\n\n /** `ceil(targetOut * oneBankMint / refOut)` — inverting the reference rate from oracle pricing. */\n const scaleInput = (targetOut: bigint): bigint => {\n const numer = targetOut * oneBankMint + refOut - BigInt(1);\n return numer / refOut;\n };\n\n let inputRaw = scaleInput(need);\n if (inputRaw > maxIn) {\n inputRaw = maxIn;\n }\n if (inputRaw < BigInt(1)) {\n inputRaw = BigInt(1);\n }\n\n const slippageBps = params.slippageBps ?? 100;\n const quoteAt = async (inAmt: bigint): Promise<PerenaSwapQuote> => {\n if (inAmt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\"getQuoteCoveringMinOutput: burn input exceeds Number.MAX_SAFE_INTEGER\");\n }\n return this.getQuote({\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n amount: Number(inAmt),\n slippageBps,\n });\n };\n\n let quote = await quoteAt(inputRaw);\n let out = BigInt(quote.outputAmount.toString());\n if (out < need && inputRaw < maxIn) {\n inputRaw = (need * inputRaw + out - BigInt(1)) / out;\n if (inputRaw > maxIn) {\n inputRaw = maxIn;\n }\n quote = await quoteAt(inputRaw);\n out = BigInt(quote.outputAmount.toString());\n }\n\n // Integer rounding inside the Perena SDK can leave the output 1 base unit\n // short even after proportional re-scaling. Bump the input by 1 and\n // re-quote once more before giving up.\n if (out < need && inputRaw < maxIn) {\n inputRaw += BigInt(1);\n if (inputRaw > maxIn) {\n inputRaw = maxIn;\n }\n quote = await quoteAt(inputRaw);\n out = BigInt(quote.outputAmount.toString());\n }\n\n if (out < need) {\n throw new Error(\n \"Perena: sized burn quote still below required yielding output (rounding); try larger holding or refresh oracles\"\n );\n }\n\n return quote;\n }\n\n /**\n * Get a quote for minting/burning USD* or staking/unstaking USD*-J.\n *\n * The operation is determined by the mints:\n * - outputMint is USD*: mint (yielding → USD*)\n * - inputMint is USD*: burn (USD* → yielding)\n * - outputMint is USD*-J: stake (USD* → USD*-J)\n * - inputMint is USD*-J: unstake (USD*-J → USD* or yielding)\n *\n * @param params - Quote parameters\n * @returns Normalized swap quote\n * @throws Error if the mint pair is not supported\n */\n async getQuote(params: SwapQuoteParams): Promise<PerenaSwapQuote> {\n const isJuniorInput = params.inputMint === this.juniorMint;\n const isJuniorOutput = params.outputMint === this.juniorMint;\n\n if (isJuniorOutput) {\n if (params.inputMint !== this.bankMint) {\n throw new Error(\"Invalid Perena quote: can only stake USD* into USD*-J\");\n }\n return this.getStakeQuote(params);\n }\n\n if (isJuniorInput) {\n return this.getUnstakeQuote(params);\n }\n\n const isMint = params.outputMint === this.bankMint;\n const isBurn = params.inputMint === this.bankMint;\n\n if (!isMint && !isBurn) {\n throw new Error(\n \"Invalid Perena quote: either inputMint or outputMint must be USD* or USD*-J\"\n );\n }\n\n if (isMint && isBurn) {\n throw new Error(\"Invalid Perena quote: cannot swap USD* to USD*\");\n }\n\n const yieldingMint = isMint ? params.inputMint : params.outputMint;\n const yieldingMintPubkey = new PublicKey(yieldingMint);\n const vault = this.sdkClient.getVault(yieldingMintPubkey);\n const amount = new BN(params.amount);\n\n const vaultInfo = await this.sdkClient.bankineco.pg.account.vaultGenState.fetch(vault);\n const feeBps = isMint ? vaultInfo.config.mintingFeeBps : vaultInfo.config.burningFeeBps;\n const priceImpactPct = feeBps / 100;\n\n if (isMint) {\n const sdkQuote = await this.sdkClient.yieldingToBankMintQuote(amount, vault);\n\n return {\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n inputAmount: BigInt(params.amount),\n outputAmount: BigInt(sdkQuote.amount.toString()),\n priceImpactPct,\n rawQuote: { operation: \"mint\", yieldingMint, sdkQuote },\n };\n } else {\n const sdkQuote = await this.sdkClient.bankMintToYieldingQuote(amount, vault);\n\n return {\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n inputAmount: BigInt(params.amount),\n outputAmount: BigInt(sdkQuote.amount.toString()),\n priceImpactPct,\n rawQuote: { operation: \"burn\", yieldingMint, sdkQuote },\n };\n }\n }\n\n /**\n * Quote for staking USD* → USD*-J.\n *\n * Shares minted = amount × bankMintPrice / sharePrice.\n * Staking has no fee; the on-chain conversion is deterministic.\n */\n private async getStakeQuote(params: SwapQuoteParams): Promise<PerenaSwapQuote> {\n const trancheState = await this.sdkClient.fetchTrancheState(true);\n const bankState = await this.sdkClient.bankineco.pg.account.bankState.fetch(\n this.sdkClient.bank\n );\n\n const amount = new BN(params.amount);\n const sharesOut = amount.mul(bankState.mint.price).div(trancheState.accounting.sharePrice);\n\n return {\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n inputAmount: BigInt(params.amount),\n outputAmount: BigInt(sharesOut.toString()),\n priceImpactPct: 0,\n rawQuote: { operation: \"stake\" },\n };\n }\n\n /**\n * Quote for unstaking USD*-J → USD* or yielding mint.\n *\n * Uses `fetchUnstakeFee` with `early: true` because instant unstake\n * always applies the early fee.\n */\n private async getUnstakeQuote(params: SwapQuoteParams): Promise<PerenaSwapQuote> {\n const isToYielding = params.outputMint !== this.bankMint;\n const targetMintPk = isToYielding ? new PublicKey(params.outputMint) : undefined;\n\n const unstakeFee = await this.sdkClient.fetchUnstakeFee({\n amount: new BN(params.amount),\n early: true,\n targetMint: targetMintPk,\n });\n\n const totalFee = unstakeFee.feeAmount.add(unstakeFee.burningFeeAmount);\n const grossOutput = unstakeFee.amountAfterFee.add(totalFee);\n const feePct = grossOutput.isZero() ? 0 : (totalFee.toNumber() / grossOutput.toNumber()) * 100;\n\n return {\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n inputAmount: BigInt(params.amount),\n outputAmount: BigInt(unstakeFee.amountAfterFee.toString()),\n priceImpactPct: feePct,\n rawQuote: {\n operation: \"unstake\",\n targetMint: isToYielding ? params.outputMint : undefined,\n unstakeFee,\n },\n };\n }\n\n /**\n * Get CPI accounts for a Perena instruction.\n *\n * Account order matches the IDL for the respective instruction.\n *\n * @param quote - Quote from getQuote()\n * @param userPublicKey - Address that will execute the swap (can be a PDA)\n * @param options - Options on building the CPI\n * @returns CPI accounts, program ID, and serialized instruction data\n */\n async getSwapCpiData(\n quote: PerenaSwapQuote,\n userPublicKey: Address,\n _options?: SwapInstructionOptions\n ): Promise<CpiData> {\n const { operation } = quote.rawQuote;\n\n switch (operation) {\n case \"mint\":\n case \"burn\":\n return this.getMintBurnCpiData(quote, userPublicKey);\n case \"stake\":\n return await this.getStakeCpiData(quote, userPublicKey);\n case \"unstake\":\n return await this.getInstantUnstakeCpiData(quote, userPublicKey);\n case \"request_unstake\": {\n const rq = quote.rawQuote as Extract<PerenaRawQuote, { operation: \"request_unstake\" }>;\n return await this.getRequestUnstakeCpiData({\n shares: new BN(quote.inputAmount.toString()),\n queueId: rq.queueId,\n userPublicKey,\n payer: rq.payer,\n targetMint: rq.targetMint,\n });\n }\n case \"fulfill_unstake\": {\n const fq = quote.rawQuote as Extract<PerenaRawQuote, { operation: \"fulfill_unstake\" }>;\n return await this.getFulfillUnstakeCpiData({\n withdrawalQueue: fq.withdrawalQueue,\n signer: fq.owner,\n queuePayer: fq.queuePayer,\n owner: fq.owner,\n targetMint: fq.targetMint,\n });\n }\n }\n }\n\n /**\n * Derive the withdrawal queue PDA for a given user and queue slot.\n */\n deriveWithdrawalQueue(user: Address, queueId: number): Address {\n return fromWeb3Pk(\n this.sdkClient.bankineco.withdrawalQueuePDA(this.sdkClient.bank, new PublicKey(user), queueId)\n );\n }\n\n /**\n * Fetch all active withdrawal queue PDAs owned by `user`.\n *\n * \"Active\" means the queue account exists, is owned by Perena, and currently\n * holds a non-zero locked amount.\n */\n async getActiveWithdrawalQueues(user: Address): Promise<Address[]> {\n const { data } = await this.cache.getDataOrThrow<Address[]>(\n async () => {\n const userPublicKey = new PublicKey(user);\n const queueInfos: WithdrawalQueueEntry[] =\n await this.sdkClient.fetchAllWithdrawalQueues(userPublicKey);\n\n return queueInfos\n .filter((queueInfo) => queueInfo.amount.gt(new BN(0)))\n .map((queueInfo) => fromWeb3Pk(queueInfo.address));\n },\n ACTIVE_WITHDRAWAL_QUEUES_CACHE_CATEGORY,\n user\n );\n return data;\n }\n\n /**\n * Cache invalidation descriptor for the active-withdrawal-queues snapshot of\n * one owner. Use this when a transaction may create, consume, or otherwise\n * mutate Perena withdrawal queues outside this exact client instance.\n */\n getActiveWithdrawalQueuesCacheInvalidation(owner: Address): TransactionCacheInvalidation {\n return this.getActiveWithdrawalQueuesInvalidation(owner);\n }\n\n private getActiveWithdrawalQueuesInvalidation(owner: Address): TransactionCacheInvalidation {\n return {\n client: \"perena\",\n dataCache: this.cache,\n category: ACTIVE_WITHDRAWAL_QUEUES_CACHE_CATEGORY,\n id: owner,\n };\n }\n\n /**\n * Build CPI data for mint_w_yielding_gen or burn_for_yielding_gen.\n */\n private async getMintBurnCpiData(\n quote: PerenaSwapQuote,\n userPublicKey: Address\n ): Promise<CpiData> {\n const raw = quote.rawQuote as Extract<PerenaRawQuote, { operation: \"mint\" | \"burn\" }>;\n const isMint = raw.operation === \"mint\";\n const action = isMint ? BankinecoAction.Mint : BankinecoAction.Burn;\n\n const cpiAccounts = await this.sdkClient.getMintAndBurnCpiAccounts(\n new PublicKey(raw.yieldingMint),\n action,\n new PublicKey(userPublicKey)\n );\n\n const accounts: CustomAccountMeta[] = [\n toCustomAccountMeta(userPublicKey, false, undefined, false),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.bankState),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.vaultState),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.oracleState),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.yieldingMint),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.bankMint),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.yieldingUserTa),\n {\n ...toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.bankMintUserTa),\n isRequiredAta: {\n mint: fromWeb3Pk(cpiAccounts.bankMint.pubkey),\n owner: userPublicKey,\n tokenProgram: mints.get(\"USD*\")!.tokenProgram,\n },\n },\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.yieldingVaultAta),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.teamState),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.feeTeamAta),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.systemProgram),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.tokenProgram),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.yieldingMintProgram),\n toCustomAccountMetaFromWeb3AccountMeta(cpiAccounts.associatedTokenProgram),\n ...(cpiAccounts.remainingAccounts ?? []).map(\n (meta: { pubkey: PublicKey; isWritable: boolean; isSigner: boolean }) =>\n toCustomAccountMeta(\n meta.pubkey.toBase58() as Address,\n meta.isWritable,\n undefined,\n meta.isSigner\n )\n ),\n ];\n\n return {\n cpiType: isMint ? CpiTypes.PERENA_MINT : CpiTypes.PERENA_BURN,\n accounts,\n programId: PERENA_PROGRAM_ID,\n data: isMint\n ? getPerenaMintArgs({\n amountYieldingDeposit: quote.inputAmount,\n minBankMintMinted: quote.outputAmount,\n })\n : getPerenaBurnArgs({\n amountToBurn: quote.inputAmount,\n minimumYieldingWithdrawn: quote.outputAmount,\n }),\n };\n }\n\n /**\n * Build CPI data for stake_junior.\n *\n * Account order matches the IDL:\n * user, tranche_state, bank_state, bank_mint, junior_mint,\n * user_bank_mint_ata, user_junior_mint_ata, junior_escrow_ata,\n * system_program, token_program, associated_token_program\n */\n private async getStakeCpiData(quote: PerenaSwapQuote, userPublicKey: Address): Promise<CpiData> {\n const userPk = new PublicKey(userPublicKey);\n const trancheAccounts = await this.sdkClient.getStakeCpiAccounts(userPk);\n\n const { bankMint, juniorMint, tokenProgram } = trancheAccounts;\n const userBankMintAta = await getAtaAddress(\n fromWeb3Pk(bankMint),\n userPublicKey,\n fromWeb3Pk(tokenProgram)\n );\n const userJuniorMintAta = await getAtaAddress(\n fromWeb3Pk(juniorMint),\n userPublicKey,\n fromWeb3Pk(tokenProgram)\n );\n\n const accounts: CustomAccountMeta[] = [\n toCustomAccountMeta(userPublicKey, true, undefined, false),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.trancheState), true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.bankState)),\n toCustomAccountMeta(fromWeb3Pk(bankMint)),\n toCustomAccountMeta(fromWeb3Pk(juniorMint), true),\n toCustomAccountMeta(userBankMintAta, true),\n {\n ...toCustomAccountMeta(userJuniorMintAta, true),\n isRequiredAta: {\n mint: this.juniorMint,\n owner: userPublicKey,\n tokenProgram: mints.get(\"USD*-J\")!.tokenProgram,\n },\n },\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.juniorEscrowAta), true),\n toCustomAccountMeta(SYSTEM_PROGRAM_ADDRESS),\n toCustomAccountMeta(fromWeb3Pk(tokenProgram)),\n toCustomAccountMeta(ASSOCIATED_TOKEN_PROGRAM_ADDRESS),\n ];\n\n return {\n cpiType: CpiTypes.PERENA_STAKE,\n accounts,\n programId: PERENA_PROGRAM_ID,\n data: numToU64Bytes(quote.inputAmount),\n };\n }\n\n /**\n * Build CPI data for instant_unstake_junior.\n *\n * Account order matches the IDL:\n * user, tranche_state, bank_state, bank_mint, target_mint, junior_mint,\n * user_junior_mint_ata, owner_bank_mint_ata, junior_escrow_ata,\n * locked_junior_shares_ata, token_program,\n * [vault_state, vault_oracle_state, vault_team_state, yielding_mint,\n * yielding_vault_ata, owner_yielding_ta, vault_fee_team_ata,\n * yielding_mint_program] (optional, when unstaking to a yielding mint)\n */\n private async getInstantUnstakeCpiData(\n quote: PerenaSwapQuote,\n userPublicKey: Address\n ): Promise<CpiData> {\n const raw = quote.rawQuote as Extract<PerenaRawQuote, { operation: \"unstake\" }>;\n const userPk = new PublicKey(userPublicKey);\n\n const targetMintPk = raw.targetMint ? new PublicKey(raw.targetMint) : undefined;\n const trancheAccounts = await this.sdkClient.getUnstakeCpiAccounts(userPk, targetMintPk);\n\n const { bankMint, juniorMint, tokenProgram } = trancheAccounts;\n const userJuniorMintAta = await getAtaAddress(\n fromWeb3Pk(juniorMint),\n userPublicKey,\n fromWeb3Pk(tokenProgram)\n );\n const ownerBankMintAta = await getAtaAddress(\n fromWeb3Pk(bankMint),\n userPublicKey,\n fromWeb3Pk(tokenProgram)\n );\n const targetMintAddress: Address = raw.targetMint ?? this.bankMint;\n\n const accounts: CustomAccountMeta[] = [\n toCustomAccountMeta(userPublicKey, false, undefined, false),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.trancheState), true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.bankState), true),\n toCustomAccountMeta(fromWeb3Pk(bankMint), true),\n toCustomAccountMeta(targetMintAddress),\n toCustomAccountMeta(fromWeb3Pk(juniorMint), true),\n toCustomAccountMeta(userJuniorMintAta, true),\n {\n ...toCustomAccountMeta(ownerBankMintAta, true),\n isRequiredAta: {\n mint: fromWeb3Pk(bankMint),\n owner: userPublicKey,\n tokenProgram: mints.get(\"USD*\")!.tokenProgram,\n },\n },\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.juniorEscrowAta), true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.lockedJuniorSharesAta), true),\n toCustomAccountMeta(fromWeb3Pk(tokenProgram)),\n ];\n\n this.pushYieldingRedemptionAccounts(accounts, trancheAccounts, userPublicKey);\n\n return {\n cpiType: CpiTypes.PERENA_INSTANT_UNSTAKE,\n accounts,\n programId: PERENA_PROGRAM_ID,\n data: numToU64Bytes(quote.inputAmount),\n };\n }\n\n /**\n * Build CPI data for request_unstake_junior.\n *\n * Account order matches the IDL:\n * user, payer, withdrawal_queue, tranche_state, bank_state, bank_mint,\n * target_mint, junior_mint, user_junior_mint_ata, locked_junior_shares_ata,\n * system_program, token_program\n */\n async getRequestUnstakeCpiData(params: RequestUnstakeParams): Promise<CpiData> {\n const userPk = new PublicKey(params.userPublicKey);\n const targetMintPk = params.targetMint ? new PublicKey(params.targetMint) : undefined;\n const trancheAccounts = await this.sdkClient.getUnstakeCpiAccounts(userPk, targetMintPk);\n\n const { bankMint, juniorMint, tokenProgram } = trancheAccounts;\n const userJuniorMintAta = await getAtaAddress(\n fromWeb3Pk(juniorMint),\n params.userPublicKey,\n fromWeb3Pk(tokenProgram)\n );\n const targetMintAddress: Address = params.targetMint ?? this.bankMint;\n const withdrawalQueue = this.deriveWithdrawalQueue(params.userPublicKey, params.queueId);\n\n const accounts: CustomAccountMeta[] = [\n toCustomAccountMeta(params.userPublicKey, false, undefined, false),\n toCustomAccountMeta(params.payer, true, undefined, true),\n toCustomAccountMeta(withdrawalQueue, true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.trancheState)),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.bankState)),\n toCustomAccountMeta(fromWeb3Pk(bankMint)),\n toCustomAccountMeta(targetMintAddress),\n toCustomAccountMeta(fromWeb3Pk(juniorMint)),\n toCustomAccountMeta(userJuniorMintAta, true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.lockedJuniorSharesAta), true),\n toCustomAccountMeta(SYSTEM_PROGRAM_ADDRESS),\n toCustomAccountMeta(fromWeb3Pk(tokenProgram)),\n ];\n\n return {\n cpiType: CpiTypes.PERENA_REQUEST_UNSTAKE,\n accounts,\n programId: PERENA_PROGRAM_ID,\n data: getPerenaRequestUnstakeArgs({\n shares: params.shares,\n queueId: params.queueId,\n }),\n postSuccessCacheInvalidations: [\n this.getActiveWithdrawalQueuesInvalidation(params.userPublicKey),\n ],\n };\n }\n\n /**\n * Build CPI data for fulfill_unstake_junior.\n *\n * Account order matches the IDL:\n * signer, queue_payer, withdrawal_queue, tranche_state, bank_state,\n * bank_mint, junior_mint, owner_bank_mint_ata, junior_escrow_ata,\n * locked_junior_shares_ata, token_program,\n * [vault_state, vault_oracle_state, vault_team_state, yielding_mint,\n * yielding_vault_ata, owner_yielding_ta, vault_fee_team_ata,\n * yielding_mint_program] (optional, when fulfilling to a yielding mint)\n */\n async getFulfillUnstakeCpiData(params: FulfillUnstakeParams): Promise<CpiData> {\n const ownerPk = new PublicKey(params.owner);\n const targetMintPk = params.targetMint ? new PublicKey(params.targetMint) : undefined;\n const trancheAccounts = await this.sdkClient.getUnstakeCpiAccounts(ownerPk, targetMintPk);\n\n const { bankMint, juniorMint, tokenProgram } = trancheAccounts;\n const ownerBankMintAta = await getAtaAddress(\n fromWeb3Pk(bankMint),\n params.owner,\n fromWeb3Pk(tokenProgram)\n );\n\n const accounts: CustomAccountMeta[] = [\n toCustomAccountMeta(params.signer, false, undefined, false),\n toCustomAccountMeta(params.queuePayer, true),\n toCustomAccountMeta(params.withdrawalQueue, true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.trancheState), true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.bankState), true),\n toCustomAccountMeta(fromWeb3Pk(bankMint), true),\n toCustomAccountMeta(fromWeb3Pk(juniorMint), true),\n {\n ...toCustomAccountMeta(ownerBankMintAta, true),\n isRequiredAta: {\n mint: fromWeb3Pk(bankMint),\n owner: params.owner,\n tokenProgram: mints.get(\"USD*\")!.tokenProgram,\n },\n },\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.juniorEscrowAta), true),\n toCustomAccountMeta(fromWeb3Pk(trancheAccounts.lockedJuniorSharesAta), true),\n toCustomAccountMeta(fromWeb3Pk(tokenProgram)),\n ];\n\n this.pushYieldingRedemptionAccounts(accounts, trancheAccounts, params.owner);\n\n return {\n cpiType: CpiTypes.PERENA_FULFILL_UNSTAKE,\n accounts,\n programId: PERENA_PROGRAM_ID,\n data: new Uint8Array(0),\n postSuccessCacheInvalidations: [this.getActiveWithdrawalQueuesInvalidation(params.owner)],\n };\n }\n\n /**\n * Appends the 8 yielding-redemption account slots that `instant_unstake_junior`\n * and `fulfill_unstake_junior` expect after `token_program`.\n *\n * When a yielding mint is involved, real accounts are pushed. Otherwise Anchor\n * still requires all 8 slots to be present — each set to the program ID as the\n * `Option<Account>` sentinel for `None`.\n */\n private pushYieldingRedemptionAccounts(\n accounts: CustomAccountMeta[],\n trancheAccounts: TrancheCpiAccounts,\n owner: Address\n ): void {\n const yr = trancheAccounts.yieldingRedemption;\n if (yr) {\n accounts.push(\n toCustomAccountMeta(fromWeb3Pk(yr.vaultState), true),\n toCustomAccountMeta(fromWeb3Pk(yr.vaultOracleState)),\n toCustomAccountMeta(fromWeb3Pk(yr.vaultTeamState), true),\n toCustomAccountMeta(fromWeb3Pk(yr.yieldingMint)),\n toCustomAccountMeta(fromWeb3Pk(yr.yieldingVaultAta), true),\n {\n ...toCustomAccountMeta(fromWeb3Pk(yr.ownerYieldingTa), true),\n isRequiredAta: {\n mint: fromWeb3Pk(yr.yieldingMint),\n owner,\n tokenProgram: fromWeb3Pk(yr.yieldingMintProgram),\n },\n },\n toCustomAccountMeta(fromWeb3Pk(yr.vaultFeeTeamAta), true),\n toCustomAccountMeta(fromWeb3Pk(yr.yieldingMintProgram))\n );\n } else {\n const sentinel = PERENA_PROGRAM_ID;\n for (let i = 0; i < 8; i++) {\n accounts.push(toCustomAccountMeta(sentinel));\n }\n }\n\n if (trancheAccounts.remainingAccounts) {\n for (const meta of trancheAccounts.remainingAccounts) {\n accounts.push(\n toCustomAccountMeta(\n meta.pubkey.toBase58() as Address,\n meta.isWritable,\n undefined,\n meta.isSigner\n )\n );\n }\n }\n }\n}\n","import { BN } from \"@anchor-lang/core\";\n\n/**\n * Inner arguments for Perena mint CPI.\n *\n * Matches Rust `PerenaMintArgs` in perena_helpers/src/cpi/mint.rs.\n * Borsh size: 16 bytes (2 × u64 LE).\n */\nexport interface PerenaMintArgs {\n /** Amount of yielding tokens to deposit (e.g., USDC amount) */\n amountYieldingDeposit: bigint | BN | number;\n /** Minimum USD* to receive (slippage protection) */\n minBankMintMinted: bigint | BN | number;\n}\n\n/**\n * Get raw borsh bytes for Perena mint CPI args.\n *\n * Returns a 16-byte `Uint8Array` (2 × u64 LE) — no length prefix.\n * Pass the result to `CpiArgsBuilder.add()` or `serializeArgs()`.\n *\n * @example\n * ```typescript\n * const cpiArgs = new CpiArgsBuilder()\n * .add(getPerenaMintArgs({ amountYieldingDeposit: 1_000_000, minBankMintMinted: 900_000 }))\n * .build();\n * ```\n */\nexport function getPerenaMintArgs(data: PerenaMintArgs): Uint8Array {\n const buf = Buffer.alloc(16);\n buf.writeBigUInt64LE(BigInt(data.amountYieldingDeposit.toString()), 0);\n buf.writeBigUInt64LE(BigInt(data.minBankMintMinted.toString()), 8);\n return buf;\n}\n","import { BN } from \"@anchor-lang/core\";\n\n/**\n * Inner arguments for Perena burn CPI.\n *\n * Matches Rust `PerenaBurnArgs` in perena_helpers/src/cpi/burn.rs.\n * Borsh size: 16 bytes (2 × u64 LE).\n */\nexport interface PerenaBurnArgs {\n /** Amount of USD* to burn */\n amountToBurn: bigint | BN | number;\n /** Minimum yielding tokens to receive (slippage protection) */\n minimumYieldingWithdrawn: bigint | BN | number;\n}\n\n/**\n * Get raw borsh bytes for Perena burn CPI args.\n *\n * Returns a 16-byte `Uint8Array` (2 × u64 LE) — no length prefix.\n * Pass the result to `CpiArgsBuilder.add()` or `serializeArgs()`.\n *\n * @example\n * ```typescript\n * const cpiArgs = new CpiArgsBuilder()\n * .add(getPerenaBurnArgs({ amountToBurn: 1_000_000, minimumYieldingWithdrawn: 900_000 }))\n * .build();\n * ```\n */\nexport function getPerenaBurnArgs(data: PerenaBurnArgs): Uint8Array {\n const buf = Buffer.alloc(16);\n buf.writeBigUInt64LE(BigInt(data.amountToBurn.toString()), 0);\n buf.writeBigUInt64LE(BigInt(data.minimumYieldingWithdrawn.toString()), 8);\n return buf;\n}\n","import { BN } from \"@anchor-lang/core\";\nimport { numToU64Bytes } from \"common\";\n\n/**\n * Inner arguments for Perena request_unstake_junior CPI.\n *\n * Matches the Anchor `request_unstake_junior` instruction args.\n * Borsh size: 9 bytes (1 × u64 LE + 1 × u8).\n */\nexport interface PerenaRequestUnstakeArgs {\n /** Number of junior shares to lock in the withdrawal queue */\n shares: BN | number;\n /** Queue slot id (0–255) — unique per user per bank */\n queueId: number;\n}\n\n/**\n * Get raw borsh bytes for Perena request_unstake_junior CPI args.\n *\n * Returns a 9-byte `Uint8Array` (u64 LE + u8) — no length prefix.\n */\nexport function getPerenaRequestUnstakeArgs(data: PerenaRequestUnstakeArgs): Uint8Array {\n const sharesBytes = numToU64Bytes(data.shares);\n const buf = Buffer.alloc(9);\n Buffer.from(sharesBytes).copy(buf, 0);\n buf.writeUInt8(data.queueId, 8);\n return buf;\n}\n","import { Address } from \"@solana/kit\";\nimport {\n createRpcWithRetry,\n fromUiAmount,\n MintIdentifier,\n redactRpcUrlForLog,\n toUiAmount,\n} from \"common\";\nimport { pythRequest } from \"../utils\";\nimport { PythFeed } from \"../constants/pyth\";\n\n/**\n * Upper bound on the LST/SOL exchange rate, expressed as a multiple of SOL/USD.\n * Mirrors Kamino/Scope's SPL-stake LST pricing (and the on-chain Rust\n * `SPL_STAKE_PRICE_CAP_MULTIPLIER`): the price is capped at `1.1 × SOL/USD` so a\n * corrupted or manipulated stake pool exchange rate can never value the LST\n * above 1.1 SOL.\n */\nexport const SPL_STAKE_PRICE_CAP_MULTIPLIER = 1.1;\n\n// Byte offsets into an SPL stake pool account (no discriminator; Borsh layout\n// of `spl_stake_pool::state::StakePool`). Verified on-chain: `token_program_id`\n// lands on the SPL Token program at offset 226, so these two u64s are correct.\n// account_type(1) + manager(32) + staker(32) + stake_deposit_authority(32)\n// + stake_withdraw_bump_seed(1) + validator_list(32) + reserve_stake(32)\n// + pool_mint(32) + manager_fee_account(32) + token_program_id(32) = 258\nconst STAKE_POOL_TOTAL_LAMPORTS_OFFSET = 258;\nconst STAKE_POOL_POOL_TOKEN_SUPPLY_OFFSET = 266;\n\nexport interface SplStakeLstConfig {\n /** The LST mint (the stake pool's pool token). */\n mint: MintIdentifier;\n /** The SPL stake pool account. */\n stakePool: Address;\n /** The Pyth SOL/USD feed used to convert the SOL-denominated rate to USD. */\n pythSolFeed: PythFeed;\n}\n\ninterface PythPriceResponse {\n parsed: Array<{\n price: {\n price: number;\n expo: number;\n };\n }>;\n}\n\nfunction errorWithCause(message: string, cause: unknown): Error {\n const err = new Error(message);\n (err as { cause?: unknown }).cause = cause;\n return err;\n}\n\n/** Convert a raw Pyth price + exponent into a UI number (mirrors `pyth.ts`). */\nfunction deriveValue(price: number, exponent: number): number {\n if (exponent > 0) return Number(fromUiAmount(Number(price), exponent));\n if (exponent < 0) return toUiAmount(BigInt(price), Math.abs(exponent));\n return Number(price);\n}\n\n/**\n * Read the LST/SOL exchange rate from an SPL stake pool account:\n * `rate = total_lamports / pool_token_supply` — how much SOL one LST is\n * redeemable for. The underlying SOL and the LST mint both use 9 decimals, so\n * the raw ratio is the dimensionless SOL-per-LST rate.\n */\nasync function fetchStakeRate(rpcUrl: string, stakePool: Address): Promise<number> {\n const rpc = createRpcWithRetry(rpcUrl);\n const redactedRpcUrl = redactRpcUrlForLog(rpcUrl);\n let response;\n\n try {\n response = await rpc.getAccountInfo(stakePool, { encoding: \"base64\" }).send();\n } catch (err) {\n throw errorWithCause(\n `SPL stake pool getAccountInfo failed (stakePool=${stakePool}, rpc=${redactedRpcUrl})`,\n err\n );\n }\n\n const { value } = response;\n if (!value) {\n throw new Error(\n `SPL stake pool account not found (stakePool=${stakePool}, rpc=${redactedRpcUrl})`\n );\n }\n\n const data = Buffer.from(value.data[0], \"base64\");\n const totalLamports = data.readBigUInt64LE(STAKE_POOL_TOTAL_LAMPORTS_OFFSET);\n const poolTokenSupply = data.readBigUInt64LE(STAKE_POOL_POOL_TOKEN_SUPPLY_OFFSET);\n if (poolTokenSupply === BigInt(0)) {\n throw new Error(\n `SPL stake pool has zero pool token supply (stakePool=${stakePool}, rpc=${redactedRpcUrl})`\n );\n }\n\n return Number(totalLamports) / Number(poolTokenSupply);\n}\n\n/** Fetch the latest SOL/USD realtime price from Pyth Hermes. */\nasync function fetchSolUsd(feedId: string): Promise<number> {\n let resp: Response;\n try {\n resp = await pythRequest([feedId]);\n } catch (err) {\n throw errorWithCause(`Pyth SOL/USD request failed before response (feedId=${feedId})`, err);\n }\n\n if (resp.status !== 200) {\n const body = await resp.text().catch(() => \"<failed to read response body>\");\n throw new Error(\n `Pyth SOL/USD request failed status=${resp.status} feedId=${feedId} body=${body}`\n );\n }\n\n let json: PythPriceResponse;\n try {\n json = (await resp.json()) as PythPriceResponse;\n } catch (err) {\n throw errorWithCause(`Pyth SOL/USD response JSON parse failed (feedId=${feedId})`, err);\n }\n\n const price = json.parsed[0].price;\n return deriveValue(price.price, price.expo);\n}\n\n/**\n * Price an SPL-stake LST in USD, matching Kamino/Scope and the on-chain Rust\n * `PythSplStake` oracle:\n *\n * price = min(stake_rate × SOL/USD, 1.1 × SOL/USD)\n */\nexport async function getSplStakeLstUiPrice(\n rpcUrl: string,\n config: SplStakeLstConfig\n): Promise<number> {\n const [rate, solUsd] = await Promise.all([\n fetchStakeRate(rpcUrl, config.stakePool),\n fetchSolUsd(config.pythSolFeed.feedId),\n ]);\n\n return Math.min(rate * solUsd, SPL_STAKE_PRICE_CAP_MULTIPLIER * solUsd);\n}\n","import { PerenaClient } from \"perena-helpers\";\nimport { OracleService } from \"../oracle\";\nimport { fromWeb3Pk, getMainnetRpcUrl, mints, OracleType, fetchWithRetry } from \"common\";\nimport { getSplStakeLstUiPrice, SplStakeLstConfig } from \"../feeds/splStake\";\nimport { PYTH_FEEDS } from \"../constants/pyth\";\nimport { DFDVSOL_STAKE_POOL } from \"../constants/splStake\";\n\nexport async function pythRequest(feedIds: string[]) {\n return await fetchWithRetry(\n `https://hermes.pyth.network/v2/updates/price/latest?${feedIds\n .map((x) => `ids%5B%5D=${x}`)\n .join(\"&\")}`\n );\n}\n\n/**\n * Register the Perena USD* oracle on an OracleService instance.\n */\n/** Static Perena oracle account addresses (PDAs; independent of RPC endpoint). */\nconst perenaOracleAccounts = new PerenaClient(getMainnetRpcUrl());\n\nexport function registerUsdStarOracle(oracle: OracleService): void {\n oracle.registerCustomOracle(\"USD*\", {\n priceFetcher: (rpcUrl) => new PerenaClient(rpcUrl).getLatestBankMintUiPrice(),\n oracle: fromWeb3Pk(perenaOracleAccounts.sdkClient.bank),\n oracleType: OracleType.PerenaBank,\n });\n}\n\n/**\n * Register the Perena USD*-J oracle on an OracleService instance.\n */\nexport function registerUsdStarJuniorOracle(oracle: OracleService): void {\n oracle.registerCustomOracle(\"USD*-J\", {\n priceFetcher: (rpcUrl) => new PerenaClient(rpcUrl).getLatestJuniorMintUiPrice(),\n oracle: fromWeb3Pk(perenaOracleAccounts.sdkClient.tranche),\n oracleType: OracleType.PerenaTranche,\n });\n}\n\n/**\n * Register an SPL-stake LST oracle (e.g. dfdvSOL) on an OracleService instance.\n *\n * Prices the LST as `min(stake_rate × SOL/USD, 1.1 × SOL/USD)`, matching\n * Kamino/Scope and the on-chain `PythSplStake` oracle. The primary oracle is\n * the Pyth SOL/USD feed; the SPL stake pool account is the secondary oracle.\n */\nexport function registerSplStakeLstOracle(oracle: OracleService, config: SplStakeLstConfig): void {\n oracle.registerCustomOracle(config.mint, {\n priceFetcher: (rpcUrl) => getSplStakeLstUiPrice(rpcUrl, config),\n oracle: config.pythSolFeed.account,\n oracleType: OracleType.PythSplStake,\n secondaryOracle: config.stakePool,\n });\n}\n\n/**\n * Register the dfdvSOL oracle on an OracleService instance.\n */\nexport function registerDfdvSolOracle(oracle: OracleService): void {\n const dfdvSol = mints.get(\"dfdvSOL\")!;\n registerSplStakeLstOracle(oracle, {\n mint: dfdvSol.address,\n stakePool: DFDVSOL_STAKE_POOL,\n pythSolFeed: PYTH_FEEDS.SOL,\n });\n}\n","import { Address } from \"@solana/kit\";\nimport { PriceBase, type PriceFetchContext } from \"./priceBase\";\nimport { PriceResult } from \"../types\";\n\nexport class SwitchboardPrices extends PriceBase {\n protected async internalFetchPrices(\n mints: Address[],\n _context?: PriceFetchContext\n ): Promise<Record<Address, PriceResult>> {\n // TODO\n return {};\n }\n}\n","import { Address } from \"@solana/kit\";\nimport { mints as mintRegistry, MintIdentifier, OracleType } from \"common\";\nimport { PriceBase, type PriceFetchContext } from \"./priceBase\";\nimport { PriceResult } from \"../types\";\n\nexport interface CustomOracle {\n /** Receives the RPC URL for the active environment on each fetch. */\n priceFetcher: (rpcUrl: string) => Promise<number>;\n oracle: Address;\n oracleType: OracleType;\n /** Optional secondary oracle account for composite oracle types (e.g. the\n * SPL stake pool account for `PythSplStake`). */\n secondaryOracle?: Address;\n}\n\nexport class CustomPrices extends PriceBase {\n private customOracles: Map<MintIdentifier, CustomOracle> = new Map();\n\n private getLookupKeys(mint: MintIdentifier): MintIdentifier[] {\n const symbol = mintRegistry.get(mint)?.symbol;\n const address = mintRegistry.get(mint)?.address;\n\n return [mint, symbol, address].filter((key): key is MintIdentifier => key !== undefined);\n }\n\n /**\n * Register a custom price fetcher for a given mint.\n *\n * @param mint - The mint identifier\n * @param fetcher - An async function that returns the current price\n */\n registerCustomOracle(mint: MintIdentifier, oracle: CustomOracle): void {\n this.customOracles.set(mint, oracle);\n }\n\n /**\n * Check if a custom price fetcher is registered for a given mint.\n */\n hasCustomOracle(mint: MintIdentifier): boolean {\n return this.getLookupKeys(mint).some((key) => this.customOracles.has(key));\n }\n\n protected async internalFetchPrices(\n mints: MintIdentifier[],\n context?: PriceFetchContext\n ): Promise<Record<MintIdentifier, PriceResult>> {\n const rpcUrl = context?.rpcUrl;\n if (!rpcUrl) {\n throw new Error(\"Custom oracle price fetch requires an RPC URL\");\n }\n\n const entries = await Promise.all(\n mints.map(async (mint) => {\n const oracle = this.getCustomOracle(mint);\n if (!oracle) {\n return [mint, { realtimePrice: 0 }] as const;\n }\n const price = await oracle.priceFetcher(rpcUrl);\n return [mint, { realtimePrice: price }] as const;\n })\n );\n\n return Object.fromEntries(entries);\n }\n\n getCustomOracle(mint: MintIdentifier) {\n for (const key of this.getLookupKeys(mint)) {\n const oracle = this.customOracles.get(key);\n if (oracle) {\n return oracle;\n }\n }\n\n return undefined;\n }\n}\n","import type { Environment } from \"common\";\n\n/**\n * Display fields used as the fallback when on-chain Metaplex Token-Metadata\n * is missing or empty. Mirrors {@link OnchainTokenMetadata} on the read path\n * so the consumer can treat both sources uniformly.\n */\nexport interface LycTokenMetadataEntry {\n /** Brand-cased symbol shown as the primary label (e.g. \"ksBTC\", \"primeBTC\"). */\n symbol: string;\n /** Human-readable name (e.g. \"Kestrel BTC\", \"Prime BTC\"). */\n name: string;\n}\n\n/**\n * Curated fallback registry of LYC token display metadata, keyed by the\n * token's mint address. Only used when on-chain Metaplex Token-Metadata\n * isn't set yet — the on-chain value always wins.\n *\n * This exists because:\n * 1. Multiple LYC tokens can share the same underlying collateral\n * (e.g. ksBTC and primeBTC both built on cbBTC), so the LYC token's\n * symbol cannot be synthesized from the collateral's symbol alone.\n * 2. Metaplex `update_token_metadata` requires an admin transaction we\n * don't always run before a token starts surfacing in the UI.\n *\n * Keyed by environment because LYC mints are unique per program deployment.\n *\n * To populate, add the LYC token mint address as the key. Once metadata is\n * set on-chain via:\n *\n * pnpm --filter @kestrelfi/lyc-sdk run \\\n * update-token-metadata -- test|prod <TOKEN_PDA|COLLATERAL_SYMBOL> \\\n * --name \"<Display Name>\" --symbol \"<ksXXX>\" --uri \"<json uri>\"\n *\n * the entry here can be removed.\n */\nexport const LYC_TOKEN_METADATA: Record<Environment, Record<string, LycTokenMetadataEntry>> = {\n local: {},\n test: {\n EsMqszfbgHtVgh5N2q1wKSEQQAP4HqojRVjDgDo6MB4U: { symbol: \"ksBTC\", name: \"Kestrel BTC\" },\n JD9axkbp23WabWcVJJQfBvJ9z7Qn4A2zayHhRED8ynZq: { symbol: \"ksETH\", name: \"Kestrel ETH\" },\n GFMBAKop6cdzBTqW9PP2eKddowDgXZSK1P6Bp8rCuFFm: { symbol: \"ksSOL\", name: \"Kestrel SOL\" },\n \"2z8P6DvqPzii6vuNu8JGPFBrGHQ94Fjgi9hHQQ7JcS34\": {\n symbol: \"ksDFDVSOL\",\n name: \"Kestrel dfdvSOL\",\n },\n \"8k3eDWZ6wZkJcBWYS4tzmtHfk2HjqxmwkLzr8wixXAcj\": { symbol: \"ksQQQX\", name: \"Kestrel QQQx\" },\n \"9tPaWdEkjBYW3FbEBMt38wYAGdSWFj6wGXvzPrYwC4Bp\": { symbol: \"ksSPYX\", name: \"Kestrel SPYx\" },\n },\n prod: {},\n};\n","import type { Instruction } from \"@solana/kit\";\nimport { BN } from \"@anchor-lang/core\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\nimport { LongYieldCarryBuilderBase } from \"./base\";\nimport type { MintTokenIxArgs, MintTokenTxArgs } from \"./args\";\nimport {\n getAtaAddress,\n getCreateAtaIxIfNeeded,\n mints,\n resolveTokenProgram,\n toKitInstruction,\n} from \"common\";\nimport { AMOUNT_ALL_SENTINEL } from \"../../constants/general\";\nimport { getRefreshTokenInstructionsIfStale } from \"./utils\";\n\n/** Reserve kept in the wallet when depositing \"all\" SOL (covers tx fees + rent). */\nconst SOL_RESERVE_LAMPORTS = 10_000_000; // 0.01 SOL\n\nexport class MintTokenBuilder extends LongYieldCarryBuilderBase<MintTokenIxArgs, MintTokenTxArgs> {\n async getIx(args: MintTokenIxArgs): Promise<Instruction> {\n const tokenData = await this.account.fetchToken(args.token);\n const mint = tokenData.mint;\n const collateralMint = tokenData.collateralMint;\n const tokenProgram = resolveTokenProgram(tokenData.data.config.tokenProgram);\n const collateralTokenProgram = resolveTokenProgram(tokenData.data.collateral.tokenProgram);\n const userCollateralAccount = await getAtaAddress(\n collateralMint,\n args.signer,\n collateralTokenProgram\n );\n const userTokenAccount = await getAtaAddress(mint, args.signer, tokenProgram);\n const collateralTokenAccount = await getAtaAddress(\n collateralMint,\n args.token,\n collateralTokenProgram\n );\n\n return this.program.methods\n .mintToken(args.depositAmount)\n .accountsPartial({\n signer: args.signer,\n token: args.token,\n mint,\n collateralMint,\n userCollateralAccount,\n userTokenAccount,\n collateralTokenAccount,\n tokenProgram,\n collateralTokenProgram,\n })\n .instruction()\n .then(toKitInstruction);\n }\n\n async getTx(args: MintTokenTxArgs): Promise<LongYieldCarryTransactionPlan> {\n const isAll = args.params.depositAmount === \"all\";\n\n const tokenData = await this.account.fetchToken(args.token);\n const mint = tokenData.mint;\n const collateralMint = tokenData.collateralMint;\n const tokenProgram = resolveTokenProgram(tokenData.data.config.tokenProgram);\n const instructions: Instruction[] = [];\n const postSuccessCacheInvalidations: NonNullable<\n LongYieldCarryTransactionPlan[\"postSuccessCacheInvalidations\"]\n > = [];\n instructions.push(\n ...(await getRefreshTokenInstructionsIfStale(this.context, args.signer, tokenData))\n );\n\n // Resolve the deposit amount. For native SOL + \"all\", we query the wallet\n // balance and reserve 0.01 SOL for tx fees, then wrap that concrete amount.\n // For non-SOL + \"all\", use the on-chain sentinel so the program reads the\n // ATA balance at execution time.\n const solMint = mints.get(\"SOL\");\n const isSolCollateral = solMint != null && collateralMint === solMint.address;\n let depositAmount: BN;\n\n if (isAll && isSolCollateral) {\n const { value: balanceLamports } = await this.rpc.getBalance(args.signer).send();\n const available = BigInt(balanceLamports.toString()) - BigInt(SOL_RESERVE_LAMPORTS);\n if (available <= 0n) {\n throw new Error(\n `Insufficient SOL balance: need more than ${\n SOL_RESERVE_LAMPORTS / 1e9\n } SOL reserved for fees`\n );\n }\n depositAmount = new BN(available.toString());\n } else if (isAll) {\n depositAmount = AMOUNT_ALL_SENTINEL;\n } else {\n depositAmount = args.params.depositAmount as BN;\n }\n\n if (!isAll || isSolCollateral) {\n const wrap = await this.getWrapSolInstructionsIfMintIsSol(\n args.signer,\n collateralMint,\n depositAmount\n );\n if (wrap.instructions) {\n instructions.push(...wrap.instructions);\n }\n if (wrap.postSuccessCacheInvalidations) {\n postSuccessCacheInvalidations.push(...wrap.postSuccessCacheInvalidations);\n }\n }\n\n const createAtaOptions = { accountClient: this.account };\n const yTokenAta = await getCreateAtaIxIfNeeded(\n this.rpc,\n args.signer,\n mint,\n args.signer,\n tokenProgram,\n createAtaOptions\n );\n if (yTokenAta.instruction) {\n instructions.push(yTokenAta.instruction);\n }\n postSuccessCacheInvalidations.push(...yTokenAta.postSuccessCacheInvalidations);\n instructions.push(\n await this.getIx({\n signer: args.signer,\n token: args.token,\n depositAmount,\n })\n );\n postSuccessCacheInvalidations.push({ client: \"lycToken\", tokenPda: args.token });\n\n return {\n instructions,\n lookupTables: this.getTxLookupTables(args.token),\n postSuccessCacheInvalidations,\n };\n }\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\nimport { LongYieldCarrySingleInstructionBuilderService } from \"./base\";\nimport type { RefreshTokenStateIxArgs } from \"./args\";\nimport {\n type CpiData,\n LendingPlatform,\n createCpiRefs,\n fromWeb3Pk,\n toKitInstruction,\n toWeb3AccountMeta,\n} from \"common\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { RefreshYieldingBankBuilder } from \"./refreshYieldingBankBuilder\";\n\ninterface RefreshPrerequisiteTarget {\n pool: Address;\n userAccount: Address;\n collateralReserves: Address[];\n debtReserves: Address[];\n}\n\nexport class RefreshTokenStateBuilder extends LongYieldCarrySingleInstructionBuilderService<RefreshTokenStateIxArgs> {\n async getIx(args: RefreshTokenStateIxArgs): Promise<Instruction> {\n const { prerequisiteCpis, accountRefs, remainingAccounts } =\n await this.getRefreshTokenStateParams(args.token);\n\n return this.program.methods\n .refreshTokenState({\n prerequisiteCpis,\n accountRefs,\n })\n .accountsPartial({\n signer: args.signer,\n token: args.token,\n collateralOracle: args.collateralOracle,\n secondaryCollateralOracle: args.secondaryCollateralOracle ?? null,\n collateralTokenAccount: args.collateralTokenAccount,\n collateralTokenProgram: args.collateralTokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n })\n .remainingAccounts(remainingAccounts.map(toWeb3AccountMeta))\n .instruction()\n .then(toKitInstruction);\n }\n\n async getTx(args: RefreshTokenStateIxArgs): Promise<LongYieldCarryTransactionPlan> {\n const ixs: Instruction[] = [];\n const tokenAccount = await this.account.fetchToken(args.token);\n const uniqueBanks = new Set<Address>();\n\n for (const { data: carry } of tokenAccount.activeCarryPositions) {\n const [yieldingBank] = await this.pda.deriveYieldingBankPda(\n fromWeb3Pk(carry.yieldingBaseMint),\n carry.yieldingBankId\n );\n uniqueBanks.add(yieldingBank);\n }\n\n for (const yieldingBank of uniqueBanks) {\n const refreshYieldingBankPlan = await new RefreshYieldingBankBuilder(this.context).getTx({\n signer: args.signer,\n yieldingBank,\n });\n ixs.push(...refreshYieldingBankPlan.instructions);\n }\n\n ixs.push(await this.getIx(args));\n\n return {\n instructions: ixs,\n lookupTables: this.getTxLookupTables(args.token),\n };\n }\n\n private async getRefreshTokenStateParams(token: Address) {\n const tokenData = await this.account.fetchToken(token);\n const refreshAccounts = await this.account.getTokenRefreshAccounts(token);\n const prerequisiteCpis: CpiData[] = [];\n const refreshTargetsByPlatform = new Map<\n LendingPlatform,\n Map<string, RefreshPrerequisiteTarget>\n >();\n\n for (const { data: position } of tokenData.activeLendingPositions) {\n const platform = this.lendingPlatformClients.getPlatformForPosition(position);\n if (platform === LendingPlatform.None) {\n continue;\n }\n\n const pool = fromWeb3Pk(position.pool);\n const userAccount = fromWeb3Pk(position.protocolUserAcc);\n const collateralReserve = fromWeb3Pk(position.collateralReserve);\n const debtReserve = fromWeb3Pk(position.debtReserve);\n const platformTargets =\n refreshTargetsByPlatform.get(platform) ?? new Map<string, RefreshPrerequisiteTarget>();\n const targetKey = `${pool}:${userAccount}`;\n if (platformTargets.has(targetKey)) {\n continue;\n }\n platformTargets.set(targetKey, {\n pool,\n userAccount,\n collateralReserves: [collateralReserve],\n debtReserves: [debtReserve],\n });\n refreshTargetsByPlatform.set(platform, platformTargets);\n }\n\n for (const [platform, platformTargets] of refreshTargetsByPlatform) {\n const lpClient = this.lendingPlatformClients.getByPlatform(platform);\n const positionPrerequisiteCpis = await lpClient.ix.getPrerequisiteCpisForRefresh([\n ...platformTargets.values(),\n ]);\n prerequisiteCpis.push(...positionPrerequisiteCpis);\n }\n\n // Compute account indices. refreshAccounts is ordered as:\n // [userAcc, collateralReserve, debtOracle] × numActiveLPs, then [yieldingBank] × numActiveCarry\n // initialAccounts are prepended to the pool at stable positions 0..N-1 by createCpiRefs,\n // so indices are the same whether or not prereq CPIs are present.\n const numActiveLPs = tokenData.activeLendingPositions.length;\n const lendingPositions = tokenData.activeLendingPositions.map((_, i) => ({\n userAccount: i * 3,\n collateralReserve: i * 3 + 1,\n debtOracle: i * 3 + 2,\n }));\n const carryPositions = Buffer.from(\n tokenData.activeCarryPositions.map((_, i) => numActiveLPs * 3 + i)\n );\n const accountRefs = { lendingPositions, carryPositions };\n\n if (!prerequisiteCpis.length) {\n return {\n prerequisiteCpis: null,\n accountRefs,\n remainingAccounts: refreshAccounts,\n };\n }\n\n const { accounts: remainingAccounts, refs: prerequisiteCpiRefs } = createCpiRefs(\n prerequisiteCpis,\n {\n initialAccounts: refreshAccounts,\n }\n );\n\n return {\n prerequisiteCpis: prerequisiteCpiRefs,\n accountRefs,\n remainingAccounts,\n };\n }\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\nimport { LongYieldCarryBuilderBase } from \"./base\";\nimport type { RefreshYieldingBankIxArgs, RefreshYieldingBankTxArgs } from \"./args\";\nimport { toKitInstruction, toWeb3AccountMeta } from \"common\";\n\nexport class RefreshYieldingBankBuilder extends LongYieldCarryBuilderBase<\n RefreshYieldingBankIxArgs,\n RefreshYieldingBankTxArgs\n> {\n async getIx(args: RefreshYieldingBankIxArgs): Promise<Instruction> {\n const oracleAccounts = await this.account.getYieldingBankRefreshAccounts(\n args.yieldingBank,\n undefined,\n args.externalLiquiditySources\n );\n\n return this.program.methods\n .refreshYieldingBank()\n .accountsPartial({\n signer: args.signer,\n yieldingBank: args.yieldingBank,\n })\n .remainingAccounts(oracleAccounts.map(toWeb3AccountMeta))\n .instruction()\n .then(toKitInstruction);\n }\n\n async getTx(args: RefreshYieldingBankTxArgs): Promise<LongYieldCarryTransactionPlan> {\n const { externalLiquiditySources } =\n await this.externalLiquidityResolver.resolveYieldingBankRefreshExternalLiquidity(\n this.account,\n args.yieldingBank\n );\n const ix = await this.getIx({\n signer: args.signer,\n yieldingBank: args.yieldingBank,\n externalLiquiditySources,\n });\n return { instructions: [ix], lookupTables: this.getTxLookupTables() };\n }\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport { fromWeb3Pk, getAtaAddress, resolveTokenProgram } from \"common\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\nimport type { LongYieldCarryBuilderContext } from \"../types/builders\";\nimport type { LYCToken } from \"../../models\";\n// Specific module, not the utils barrel — keeps the Kamino-heavy enrichment\n// graph out of the browser-safe `core` entry (see src/core.ts).\nimport { mergeLycLookupTables } from \"../../utils/lookupTables\";\nimport type { RefreshTokensBuilderTxArgs } from \"./args\";\nimport { RefreshTokenStateBuilder } from \"./refreshTokenStateBuilder\";\nimport { RefreshYieldingBankBuilder } from \"./refreshYieldingBankBuilder\";\n\nexport class RefreshTokensBuilder {\n constructor(private readonly context: LongYieldCarryBuilderContext) {}\n\n async getTx(args: RefreshTokensBuilderTxArgs): Promise<LongYieldCarryTransactionPlan> {\n const tokens = await this.context.account.fetchTokens(args.params.tokens);\n const instructions: Instruction[] = [];\n const ybAddresses = await this.getYieldingBanksToRefresh(\n tokens,\n args.params.alwaysRefreshYieldingBanks ?? false\n );\n const refreshYieldingBankBuilder = new RefreshYieldingBankBuilder(this.context);\n const refreshTokenStateBuilder = new RefreshTokenStateBuilder(this.context);\n\n for (const yieldingBank of ybAddresses) {\n const ybPlan = await refreshYieldingBankBuilder.getTx({\n signer: args.signer,\n yieldingBank,\n });\n instructions.push(...ybPlan.instructions);\n }\n\n for (const token of tokens) {\n instructions.push(\n await refreshTokenStateBuilder.getIx({\n signer: args.signer,\n token: token.address,\n collateralOracle: fromWeb3Pk(token.data.collateral.oracle),\n secondaryCollateralOracle: fromWeb3Pk(token.data.collateral.secondaryOracle),\n collateralTokenAccount: await getAtaAddress(\n token.collateralMint,\n token.address,\n resolveTokenProgram(token.data.collateral.tokenProgram)\n ),\n collateralTokenProgram: resolveTokenProgram(token.data.collateral.tokenProgram),\n })\n );\n }\n\n return {\n instructions,\n lookupTables: mergeLycLookupTables(this.context.environment, args.params.tokens),\n };\n }\n\n private async getYieldingBanksToRefresh(\n tokens: LYCToken[],\n alwaysRefreshYieldingBanks: boolean\n ): Promise<Address[]> {\n const uniqueYbAddresses: Address[] = [];\n const seen = new Set<Address>();\n\n for (const token of tokens) {\n for (const { data: carry } of token.activeCarryPositions) {\n const [yieldingBank] = await this.context.pda.deriveYieldingBankPda(\n fromWeb3Pk(carry.yieldingBaseMint),\n carry.yieldingBankId\n );\n if (!seen.has(yieldingBank)) {\n seen.add(yieldingBank);\n uniqueYbAddresses.push(yieldingBank);\n }\n }\n }\n\n if (alwaysRefreshYieldingBanks || uniqueYbAddresses.length === 0) {\n return uniqueYbAddresses;\n }\n\n const banks = await this.context.account.fetchYieldingBanks(uniqueYbAddresses);\n return banks.filter((bank) => bank.isStale).map((bank) => bank.address);\n }\n}\n","import type { Address, Instruction } from \"@solana/kit\";\nimport type { LongYieldCarryBuilderContext } from \"../types/builders\";\nimport type { LYCToken } from \"../../models/lycToken\";\nimport { TOKEN_STALENESS_THRESHOLD_SECS } from \"../../constants/general\";\nimport { RefreshTokensBuilder } from \"./refreshTokensBuilder\";\n\nexport async function getRefreshTokenInstructionsIfStale(\n context: LongYieldCarryBuilderContext,\n signer: Address,\n tokenData: LYCToken\n): Promise<Instruction[]> {\n const lastRefreshed = tokenData.data.accounting.lastRefreshedTs.toNumber();\n const nowSecs = Math.floor(Date.now() / 1000);\n if (nowSecs - lastRefreshed <= TOKEN_STALENESS_THRESHOLD_SECS) {\n return [];\n }\n\n return new RefreshTokensBuilder(context)\n .getTx({\n signer,\n params: {\n tokens: [tokenData.address],\n },\n })\n .then((plan) => [...plan.instructions]);\n}\n","import { BN } from \"@anchor-lang/core\";\nimport type { Instruction } from \"@solana/kit\";\nimport { SYSTEM_PROGRAM_ADDRESS } from \"@solana-program/system\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n createSignerFromAddress,\n fetchSplTokenAccountAmounts,\n getAtaAddress,\n getUnwrapSolInstruction,\n mints,\n resolveTokenProgram,\n toKitInstruction,\n type TransactionCacheInvalidation,\n} from \"common\";\nimport { AMOUNT_ALL_SENTINEL } from \"../../constants/general\";\nimport type { LYCToken } from \"../../models/lycToken\";\n// Import from the specific util modules, not the barrel: the barrel pulls the\n// enrichment/carry graph (lending-platforms → Kamino SDKs), which must stay\n// out of the browser-safe `core` entry that includes this builder.\nimport { getTokenCacheInvalidation } from \"../../utils/cache\";\nimport { currentEpochId } from \"../../utils/general\";\nimport type { LongYieldCarryTransactionPlan } from \"../types\";\nimport type { BurnTokenIxArgs, BurnTokenTxArgs } from \"./args\";\nimport { LongYieldCarryBuilderBase } from \"./base\";\nimport { getRefreshTokenInstructionsIfStale } from \"./utils\";\n\nexport interface BundledBurnPlan {\n instructions?: Instruction[];\n [key: string]: unknown;\n}\n\ntype ResolvedBurnTokenTxArgs = Omit<BurnTokenTxArgs, \"params\"> & {\n params: Omit<BurnTokenTxArgs[\"params\"], \"burnAmount\"> & { burnAmount: BN | number };\n ixBurnAmount: BN;\n};\n\ntype BurnTokenAsyncAccounts = {\n epochId: BN | number;\n requestSequence: BN | number;\n redemptionEpoch: BurnTokenIxArgs[\"token\"];\n request: BurnTokenIxArgs[\"token\"];\n requestTokenAccount: BurnTokenIxArgs[\"token\"];\n};\n\nexport class BurnTokenBuilder extends LongYieldCarryBuilderBase<BurnTokenIxArgs, BurnTokenTxArgs> {\n async getIx(args: BurnTokenIxArgs): Promise<Instruction> {\n const tokenData = await this.account.fetchToken(args.token);\n const mint = tokenData.mint;\n const collateralMint = tokenData.collateralMint;\n const tokenProgram = resolveTokenProgram(tokenData.data.config.tokenProgram);\n const collateralTokenProgram = resolveTokenProgram(tokenData.data.collateral.tokenProgram);\n const userTokenAccount = await getAtaAddress(mint, args.signer, tokenProgram);\n const userCollateralAccount = await getAtaAddress(\n collateralMint,\n args.signer,\n collateralTokenProgram\n );\n const collateralTokenAccount = await getAtaAddress(\n collateralMint,\n args.token,\n collateralTokenProgram\n );\n const asyncAccounts = await this.resolveAsyncAccounts(args, mint, tokenProgram);\n\n const burnIxArgs = asyncAccounts\n ? {\n async: {\n burnAmount: new BN(args.params.burnAmount.toString()),\n epochId: new BN(asyncAccounts.epochId.toString()),\n requestSequence: new BN(asyncAccounts.requestSequence.toString()),\n },\n }\n : {\n sync: {\n burnAmount: new BN(args.params.burnAmount.toString()),\n },\n };\n\n return this.program.methods\n .burnToken(burnIxArgs)\n .accountsPartial({\n signer: args.signer,\n payer: args.payer ?? args.signer,\n token: args.token,\n mint,\n userTokenAccount,\n collateralMint,\n userCollateralAccount,\n collateralTokenAccount,\n redemptionEpoch: asyncAccounts?.redemptionEpoch ?? null,\n request: asyncAccounts?.request ?? null,\n requestTokenAccount: asyncAccounts?.requestTokenAccount ?? null,\n tokenProgram,\n collateralTokenProgram,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n systemProgram: SYSTEM_PROGRAM_ADDRESS,\n })\n .instruction()\n .then(toKitInstruction);\n }\n\n async getTx(args: BurnTokenTxArgs): Promise<LongYieldCarryTransactionPlan> {\n const resolved = await this.resolveAllSentinel(args);\n const tokenData = await this.account.fetchToken(args.token, { fresh: true });\n const collateralTokenProgram = resolveTokenProgram(tokenData.data.collateral.tokenProgram);\n const userCollateralAtaSetup = await this.getCreateUserCollateralAtaIxIfNeeded(\n args.signer,\n tokenData.collateralMint,\n collateralTokenProgram\n );\n const refreshInstructions = await getRefreshTokenInstructionsIfStale(\n this.context,\n args.signer,\n tokenData\n );\n\n const asyncAccounts = await this.resolveAsyncFallbackParams(args.token, {\n epochId: args.params.epochId,\n requestSequence: args.params.requestSequence,\n });\n\n const instructions: Instruction[] = [...refreshInstructions];\n if (userCollateralAtaSetup.instruction) {\n instructions.push(userCollateralAtaSetup.instruction);\n }\n instructions.push(\n await this.getIx({\n signer: args.signer,\n payer: args.payer,\n token: args.token,\n params: {\n burnAmount: resolved.ixBurnAmount,\n asyncFallback: asyncAccounts,\n },\n })\n );\n\n const unwrapSolIx = await this.getUnwrapSolAfterBurnIfCollateralSol(args.signer, tokenData);\n if (unwrapSolIx) {\n instructions.push(unwrapSolIx);\n }\n\n const postSuccessCacheInvalidations: TransactionCacheInvalidation[] = [\n ...(userCollateralAtaSetup.postSuccessCacheInvalidations ?? []),\n getTokenCacheInvalidation(args.token),\n ];\n if (unwrapSolIx) {\n const userCollateralAta = await getAtaAddress(\n tokenData.collateralMint,\n args.signer,\n collateralTokenProgram\n );\n postSuccessCacheInvalidations.push({ client: \"splAta\", ata: userCollateralAta });\n }\n\n return {\n instructions,\n lookupTables: this.getTxLookupTables(args.token),\n postSuccessCacheInvalidations,\n };\n }\n\n async buildBundledBurnPlan(..._args: unknown[]): Promise<BundledBurnPlan> {\n throw new Error(\"Managed burn unwind plans were removed; use async burn funding instead.\");\n }\n\n private async resolveAllSentinel(args: BurnTokenTxArgs): Promise<ResolvedBurnTokenTxArgs> {\n if (args.params.burnAmount !== \"all\") {\n const amount = args.params.burnAmount;\n return {\n ...args,\n params: { ...args.params, burnAmount: amount },\n ixBurnAmount: new BN(amount.toString()),\n };\n }\n const tokenData = await this.account.fetchToken(args.token);\n const userTokenAta = await getAtaAddress(\n tokenData.mint,\n args.signer,\n resolveTokenProgram(tokenData.data.config.tokenProgram)\n );\n const balances = await fetchSplTokenAccountAmounts(this.rpc, [userTokenAta]);\n return {\n ...args,\n params: {\n ...args.params,\n burnAmount: new BN((balances.get(userTokenAta) ?? BigInt(0)).toString()),\n },\n ixBurnAmount: AMOUNT_ALL_SENTINEL,\n };\n }\n\n private async resolveAsyncFallbackParams(\n token: BurnTokenTxArgs[\"token\"],\n overrides: { epochId?: BN | number; requestSequence?: BN | number }\n ): Promise<NonNullable<BurnTokenIxArgs[\"params\"][\"asyncFallback\"]>> {\n const epochId = overrides.epochId ?? currentEpochId();\n const [redemptionEpoch] = await this.pda.deriveRedemptionEpochPda(\n token,\n BigInt(epochId.toString())\n );\n const requestSequence =\n overrides.requestSequence ?? (await this.resolveNextRequestSequence(redemptionEpoch));\n const [request] = await this.pda.deriveAsyncBurnRequestPda(\n token,\n BigInt(epochId.toString()),\n BigInt(requestSequence.toString())\n );\n return { epochId, requestSequence, redemptionEpoch, request };\n }\n\n private async resolveNextRequestSequence(redemptionEpoch: BurnTokenIxArgs[\"token\"]): Promise<BN> {\n try {\n const epoch = await this.program.account.redemptionEpoch.fetch(redemptionEpoch);\n return new BN(epoch.sequencing.nextRequestSequence.toString());\n } catch {\n return new BN(0);\n }\n }\n\n private async resolveAsyncAccounts(\n args: BurnTokenIxArgs,\n mint: BurnTokenIxArgs[\"token\"],\n tokenProgram: BurnTokenIxArgs[\"token\"]\n ): Promise<BurnTokenAsyncAccounts | undefined> {\n if (!args.params.asyncFallback) {\n return undefined;\n }\n const epochId = args.params.asyncFallback.epochId;\n const requestSequence = args.params.asyncFallback.requestSequence;\n const redemptionEpoch =\n args.params.asyncFallback.redemptionEpoch ??\n (await this.pda.deriveRedemptionEpochPda(args.token, BigInt(epochId.toString())))[0];\n const request =\n args.params.asyncFallback.request ??\n (\n await this.pda.deriveAsyncBurnRequestPda(\n args.token,\n BigInt(epochId.toString()),\n BigInt(requestSequence.toString())\n )\n )[0];\n return {\n epochId,\n requestSequence,\n redemptionEpoch,\n request,\n requestTokenAccount: await getAtaAddress(mint, request, tokenProgram),\n };\n }\n\n private async getUnwrapSolAfterBurnIfCollateralSol(\n signer: BurnTokenTxArgs[\"signer\"],\n tokenData: LYCToken\n ): Promise<Instruction | null> {\n const solMint = mints.get(\"SOL\");\n if (!solMint || tokenData.collateralMint !== solMint.address) {\n return null;\n }\n return getUnwrapSolInstruction(createSignerFromAddress(signer));\n }\n}\n","import { type Address } from \"@solana/kit\";\nimport { type TransactionCacheInvalidation } from \"common\";\n\nexport function getTokenCacheInvalidation(token: Address): TransactionCacheInvalidation {\n return { client: \"lycToken\", tokenPda: token };\n}\n\nexport function getYieldingBankCacheInvalidation(\n yieldingBank: Address\n): TransactionCacheInvalidation {\n return { client: \"lycYieldingBank\", yieldingBankPda: yieldingBank };\n}\n","/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is not the actual IDL. The original\n * IDL can be found at `target/idl/long_yield_carry.json`.\n */\nexport type LongYieldCarry = {\n \"address\": \"7YPAKESPJ7zJAvBuk45ZVziu6tXGKoNzg3p9YpvrH6pX\",\n \"metadata\": {\n \"name\": \"longYieldCarry\",\n \"version\": \"0.1.0\",\n \"spec\": \"0.1.0\",\n \"description\": \"Created with Anchor\"\n },\n \"instructions\": [\n {\n \"name\": \"burnToken\",\n \"docs\": [\n \"Burn long-yield-carry tokens and redeem collateral.\"\n ],\n \"discriminator\": [\n 185,\n 165,\n 216,\n 246,\n 144,\n 31,\n 70,\n 74\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Pays SOL rent when async-path PDAs are created; must authorize lamport debits.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The yToken mint. Mutable because the burn CPI decrements total supply.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"userTokenAccount\",\n \"docs\": [\n \"User's yToken ATA — source of the burn. The user is the authority.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"userCollateralAccount\",\n \"docs\": [\n \"User's collateral ATA — destination of the redeemed collateral.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral reserve — source of the collateral payout, and\",\n \"the destination for the collateral withdrawal in the liquidity path.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"requestTokenAccount\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"docs\": [\n \"Token program for yToken operations (Burn).\"\n ]\n },\n {\n \"name\": \"collateralTokenProgram\",\n \"docs\": [\n \"Token program for collateral operations (Transfer).\"\n ]\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"burnTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"cancelAsyncBurn\",\n \"docs\": [\n \"Cancel a timed-out FIFO-head async burn request while its epoch is still open.\"\n ],\n \"discriminator\": [\n 66,\n 63,\n 112,\n 221,\n 71,\n 95,\n 126,\n 145\n ],\n \"accounts\": [\n {\n \"name\": \"user\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Validated against the payer stored on the request at creation time.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"userTokenAccount\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"user\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"requestTokenAccount\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"epochRentRecipient\",\n \"docs\": [\n \"Must match `redemption_epoch.header.payer`.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"tokenProgram\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"claimIncentives\",\n \"docs\": [\n \"Claim lending-platform farm incentives and deposit them into the\",\n \"token's carry position via the yielding bank.\"\n ],\n \"discriminator\": [\n 79,\n 126,\n 77,\n 51,\n 253,\n 163,\n 193,\n 248\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"expectedIncentiveMint\"\n },\n {\n \"name\": \"tokenIncentiveAta\",\n \"docs\": [\n \"Token PDA's ATA for the reward mint — receives rewards from the claim CPI.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentiveTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expectedIncentiveMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"yieldingBank\",\n \"docs\": [\n \"Required only on the debt-mint branch. Self-pointer check happens\",\n \"inline at the start of `settle_debt_branch`.\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"yieldingBankIncentiveAta\",\n \"docs\": [\n \"Yielding bank's ATA for the reward mint — receives the transfer on the\",\n \"debt-mint branch.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yieldingBank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentiveTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expectedIncentiveMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"incentiveOracle\",\n \"docs\": [\n \"`incentive_oracle_type`, which validates feed identity. Required on\",\n \"the debt-mint and collateral-mint branches.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"feeWallet\",\n \"docs\": [\n \"Required on the fee-wallet branch.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"feeWalletIncentiveAta\",\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"feeWallet\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentiveTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expectedIncentiveMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"incentiveTokenProgram\"\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"claimIncentivesParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"closeCpiPlan\",\n \"docs\": [\n \"Close an orphaned CPI plan PDA and return its rent to the manager.\",\n \"\",\n \"CPI plan accounts normally auto-close via `close = manager` when\",\n \"`rebalance_token` succeeds. This instruction reclaims rent from any\",\n \"plans that were left open due to a failed or interrupted transaction.\"\n ],\n \"discriminator\": [\n 47,\n 118,\n 163,\n 160,\n 199,\n 31,\n 63,\n 26\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Receives the reclaimed rent. Must be the original payer of this CPI plan.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpiPlan\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"collectFees\",\n \"docs\": [\n \"Collect accrued protocol fees from a token.\"\n ],\n \"discriminator\": [\n 164,\n 152,\n 207,\n 99,\n 30,\n 186,\n 19,\n 182\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Must match either the token's `curator()` or the program-level `PROTOCOL_ADMIN`.\",\n \"If the signer is `PROTOCOL_ADMIN`, the protocol fee bucket and wallet are used\",\n \"(even when that key is also the curator). Otherwise, when the signer is the\",\n \"curator only, the curator bucket and curator fee wallet are used.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"writable\": true\n },\n {\n \"name\": \"feeWallet\",\n \"docs\": [\n \"Fee wallet that receives the minted yTokens. Must match the\",\n \"`curator_fee_wallet()` wallet when signed by the curator, or\",\n \"`protocol_fee_wallet()` when signed by PROTOCOL_ADMIN.\"\n ]\n },\n {\n \"name\": \"feeWalletTokenAccount\",\n \"docs\": [\n \"Fee wallet's yToken ATA — created on first collection, reused thereafter\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"feeWallet\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"tokenProgram\"\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"collectInterest\",\n \"docs\": [\n \"Realize accrued yield from a carry position.\"\n ],\n \"discriminator\": [\n 238,\n 101,\n 253,\n 86,\n 160,\n 25,\n 16,\n 134\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"collateralOracle\",\n \"docs\": [\n \"Collateral oracle account — refreshed before slippage validation so the\",\n \"collateral USD value is checked against a fresh price.\"\n ]\n },\n {\n \"name\": \"secondaryCollateralOracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (the SPL\",\n \"stake pool account for `PythSplStake` collateral); omit otherwise.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"redemptionOracle\",\n \"docs\": [\n \"Oracle account for the yielding bank's default redemption mint —\",\n \"refreshed at the top of the handler so share accounting and the phase 4\",\n \"slippage check all use a live price basis that matches what the SDK\",\n \"planner read when sizing the swap input.\"\n ]\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral ATA — final destination for the swapped collateral\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"ybCollateralTokenAccount\",\n \"docs\": [\n \"Yielding bank's collateral ATA — receives the swap output before the\",\n \"handler transfers the delta into the token's collateral ATA.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yieldingBank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"curatorFeeWalletCollateralAccount\",\n \"docs\": [\n \"Curator fee wallet's collateral ATA — receives the curator share of the performance fee.\",\n \"Address is the ATA of `token.roles.curator_fee_wallet()` for this collateral mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"protocolFeeWalletCollateralAccount\",\n \"docs\": [\n \"Protocol fee wallet's collateral ATA — receives the protocol share of the performance fee.\",\n \"Address is the ATA of `TokenRoles::protocol_fee_wallet()` for this collateral mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"ybRedemptionTokenAccount\",\n \"docs\": [\n \"YB's ATA for the default redemption mint — snapshotted before and after\",\n \"swap CPIs to verify only this asset was sold.\",\n \"default_redemption_mint and the yielding bank PDA.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"collateralTokenProgram\"\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"createCpiPlan\",\n \"docs\": [\n \"Create a temporary zero-copy CPI plan account for a later instruction.\"\n ],\n \"discriminator\": [\n 176,\n 0,\n 30,\n 192,\n 57,\n 208,\n 40,\n 114\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpiPlan\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 112,\n 105,\n 32,\n 112,\n 108,\n 97,\n 110\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"params.unique_id\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"params.created_ts\"\n }\n ]\n }\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"createCpiPlanParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"createToken\",\n \"docs\": [\n \"Create a new token and initialize its configuration.\"\n ],\n \"discriminator\": [\n 84,\n 52,\n 204,\n 228,\n 24,\n 140,\n 234,\n 75\n ],\n \"accounts\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"Curator that will own this token. Must be in `WHITELISTED_CURATORS`.\",\n \"Pays for account rent.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"adminRole\",\n \"docs\": [\n \"Admin multisig. `None` means \\\"use the feature-gated default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"managerRole\",\n \"docs\": [\n \"Manager ops wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curatorFeeWallet\",\n \"docs\": [\n \"Curator fee wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cbControllerRole\",\n \"docs\": [\n \"Circuit-breaker activator. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"yToken mint — must be pre-created with its authority set to the token PDA\",\n \"and freeze authority set to None. This allows the caller to set mint metadata\",\n \"(name, symbol, icon) before registering the token with the program.\"\n ]\n },\n {\n \"name\": \"collateralMint\",\n \"docs\": [\n \"The underlying collateral mint (e.g. wSOL)\"\n ]\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's account for holding unlent collateral reserves\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"tokenProgram\",\n \"docs\": [\n \"Token program for the yToken mint\"\n ]\n },\n {\n \"name\": \"collateralTokenProgram\",\n \"docs\": [\n \"Token program for the collateral mint\"\n ]\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"createTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"createTokenLendingPosition\",\n \"docs\": [\n \"Register a new lending position for a token.\"\n ],\n \"discriminator\": [\n 32,\n 13,\n 223,\n 159,\n 125,\n 144,\n 219,\n 148\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"lpPosition\",\n \"accounts\": [\n {\n \"name\": \"userAccount\",\n \"docs\": [\n \"The lending position's user/authority account.\"\n ]\n },\n {\n \"name\": \"collateralReserve\",\n \"docs\": [\n \"The lending position's collateral reserve/bank account.\"\n ]\n },\n {\n \"name\": \"debtOracle\",\n \"docs\": [\n \"Oracle for the lending position's debt asset.\"\n ]\n }\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"createTokenLendingPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"createYieldingBank\",\n \"docs\": [\n \"Create a new yielding bank for a base mint.\"\n ],\n \"discriminator\": [\n 123,\n 125,\n 211,\n 195,\n 102,\n 102,\n 90,\n 7\n ],\n \"accounts\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"Curator that will own this yielding bank. Must be in `WHITELISTED_CURATORS`.\",\n \"Pays for account rent.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"adminRole\",\n \"docs\": [\n \"Admin multisig. `None` means \\\"use the feature-gated default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"managerRole\",\n \"docs\": [\n \"Manager ops wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cbControllerRole\",\n \"docs\": [\n \"Circuit-breaker activator. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n },\n {\n \"name\": \"baseMint\"\n },\n {\n \"name\": \"defaultRedemptionMint\",\n \"docs\": [\n \"The mint used as the default source when redeeming from the bank.\",\n \"Validated as a real SPL Token / Token-2022 mint by Anchor deserialization.\"\n ]\n },\n {\n \"name\": \"baseMintTokenAccount\",\n \"docs\": [\n \"Base mint ATA owned by the yielding bank PDA — created so refresh\",\n \"can always read the token balance for the base asset.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yieldingBank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"baseMintTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"baseMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"baseMintTokenProgram\"\n },\n {\n \"name\": \"associatedTokenProgram\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"systemProgram\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"createYieldingBankParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"createYieldingBankAllocation\",\n \"docs\": [\n \"Add a new asset holding or external position to a yielding bank.\"\n ],\n \"discriminator\": [\n 213,\n 191,\n 99,\n 159,\n 78,\n 2,\n 87,\n 126\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n },\n {\n \"name\": \"allocationMint\",\n \"docs\": [\n \"Mint for the new asset holding.\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"yieldingBankAllocationConfig\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"creditUnlentToRedemptionEpoch\",\n \"docs\": [\n \"Credit already-unlent collateral reserves to a redemption epoch.\"\n ],\n \"discriminator\": [\n 236,\n 123,\n 27,\n 93,\n 229,\n 169,\n 214,\n 129\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenProgram\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"decreaseCarryPosition\",\n \"docs\": [\n \"Reduce a carry position and return freed collateral.\"\n ],\n \"discriminator\": [\n 109,\n 115,\n 98,\n 62,\n 206,\n 179,\n 42,\n 145\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true,\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"decreaseCarryPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"depositUnlentCollateral\",\n \"docs\": [\n \"Lend idle collateral from a token into a lending position.\"\n ],\n \"discriminator\": [\n 112,\n 210,\n 209,\n 249,\n 61,\n 231,\n 192,\n 207\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral reserve — balance is checked before and\",\n \"after the deposit CPI to derive the actual deposited amount.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenProgram\"\n },\n {\n \"name\": \"lendingPositionUserAccount\",\n \"docs\": [\n \"The lending position's user/authority account on the lending protocol\",\n \"(e.g. Kamino obligation). Used to refresh the position after deposit.\"\n ]\n },\n {\n \"name\": \"lendingPositionCollateralReserve\",\n \"docs\": [\n \"The lending protocol's collateral reserve account. Used to convert\",\n \"cTokens to underlying liquidity during the post-deposit refresh.\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"ixRefs\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"increaseCarryPosition\",\n \"docs\": [\n \"Increase a carry position using borrowed funds.\"\n ],\n \"discriminator\": [\n 216,\n 191,\n 255,\n 166,\n 144,\n 169,\n 3,\n 187\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"docs\": [\n \"via `remaining_accounts`, so the role check is enforced at runtime in\",\n \"the handler rather than by an Anchor constraint here.\"\n ],\n \"signer\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"increaseCarryPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"mintToken\",\n \"docs\": [\n \"Deposit collateral and mint long-yield-carry tokens.\"\n ],\n \"discriminator\": [\n 172,\n 137,\n 183,\n 14,\n 207,\n 110,\n 234,\n 56\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The yToken mint — authority is the token PDA\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"collateralMint\",\n \"docs\": [\n \"Collateral mint (for TransferChecked decimals validation)\"\n ]\n },\n {\n \"name\": \"userCollateralAccount\",\n \"docs\": [\n \"User's collateral ATA (source of deposit)\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"userTokenAccount\",\n \"docs\": [\n \"User's yToken ATA — must be created before calling this instruction\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral reserve\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"tokenProgram\",\n \"docs\": [\n \"Token program for yToken operations (MintTo)\"\n ]\n },\n {\n \"name\": \"collateralTokenProgram\",\n \"docs\": [\n \"Token program for collateral operations (TransferChecked)\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"depositAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"processAsyncBurn\",\n \"docs\": [\n \"Process the next FIFO async burn request in an epoch.\"\n ],\n \"discriminator\": [\n 95,\n 36,\n 6,\n 2,\n 122,\n 146,\n 3,\n 215\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Validated against the payer stored on the request at creation time.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true\n },\n {\n \"name\": \"user\",\n \"docs\": [\n \"collateral is wrapped SOL; otherwise unused except for identity binding.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"writable\": true\n },\n {\n \"name\": \"requestTokenAccount\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"tokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"userCollateralAccount\",\n \"docs\": [\n \"User's collateral ATA — required when collateral is not wrapped SOL.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"requestCollateralAccount\",\n \"docs\": [\n \"Request PDA's collateral ATA — required when collateral is wrapped SOL.\",\n \"The handler transfers WSOL here, then closes the account to unwrap into\",\n \"native SOL for `user`.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"epochRentRecipient\",\n \"docs\": [\n \"marks fully processed epochs). Must match `header.payer`, or `manager`\",\n \"when `payer` is default (legacy epochs).\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"tokenProgram\"\n },\n {\n \"name\": \"collateralTokenProgram\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"rebalanceToken\",\n \"docs\": [\n \"Rebalance a token across its carry positions.\"\n ],\n \"discriminator\": [\n 152,\n 98,\n 123,\n 66,\n 134,\n 191,\n 199,\n 73\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpiPlan\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"rebalanceTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"rebalanceYieldingBank\",\n \"docs\": [\n \"Rebalance a yielding bank across allocations and external liquidity.\"\n ],\n \"discriminator\": [\n 181,\n 53,\n 252,\n 136,\n 138,\n 104,\n 145,\n 137\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"ixRefs\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"recollateralizeLoss\",\n \"docs\": [\n \"Recollateralize a loss by withdrawing collateral, swapping to debt, and repaying.\"\n ],\n \"discriminator\": [\n 98,\n 11,\n 43,\n 3,\n 199,\n 227,\n 100,\n 112\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral reserve — transit account for withdrawn collateral\",\n \"before it is swapped into the debt asset.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralOracle\",\n \"docs\": [\n \"Collateral oracle — refreshed to price the collateral decrease in USD\",\n \"for the slippage check against the debt decrease.\"\n ]\n },\n {\n \"name\": \"secondaryCollateralOracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (the SPL\",\n \"stake pool account for `PythSplStake` collateral); omit otherwise.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"lpPosition\",\n \"accounts\": [\n {\n \"name\": \"userAccount\",\n \"docs\": [\n \"The lending position's user/authority account.\"\n ]\n },\n {\n \"name\": \"collateralReserve\",\n \"docs\": [\n \"The lending position's collateral reserve/bank account.\"\n ]\n },\n {\n \"name\": \"debtOracle\",\n \"docs\": [\n \"Oracle for the lending position's debt asset.\"\n ]\n }\n ]\n },\n {\n \"name\": \"collateralTokenProgram\"\n },\n {\n \"name\": \"yieldingBank\",\n \"docs\": [\n \"Yielding bank to receive any excess debt tokens remaining after repay.\",\n \"Validated at runtime: base_mint must match the lending position's debt mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"debtMint\",\n \"docs\": [\n \"Debt mint for the lending position being recollateralized.\"\n ]\n },\n {\n \"name\": \"tokenLpDebtTa\",\n \"docs\": [\n \"Token PDA's ATA for the debt mint — receives swap output, source for repay and deposit.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debtTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debtMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"yieldingBankTa\",\n \"docs\": [\n \"Yielding bank's ATA for the debt mint — destination for excess debt token deposit.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yieldingBank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debtTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debtMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"debtTokenProgram\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"recollateralizeLossParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"refreshTokenState\",\n \"docs\": [\n \"Refresh token pricing and lending-position state.\"\n ],\n \"discriminator\": [\n 229,\n 167,\n 209,\n 155,\n 223,\n 252,\n 150,\n 188\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateralOracle\",\n \"docs\": [\n \"Collateral oracle account — validated against the registered oracle\",\n \"via the OraclePriceFeed trait's refresh_price method.\"\n ]\n },\n {\n \"name\": \"secondaryCollateralOracle\",\n \"docs\": [\n \"Optional secondary oracle account, required only for composite oracle\",\n \"types. For `PythSplStake` collateral this is the SPL stake pool account;\",\n \"omit for single-account oracle types.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"docs\": [\n \"Token PDA's collateral reserve account (read actual on-chain balance)\"\n ],\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenProgram\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"refreshTokenStateParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"refreshYieldingBank\",\n \"docs\": [\n \"Refresh yielding-bank asset balances, prices, and share accounting.\"\n ],\n \"discriminator\": [\n 234,\n 183,\n 180,\n 72,\n 113,\n 250,\n 213,\n 76\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"resetTokenBurnRateLimit\",\n \"docs\": [\n \"Reset the burn rate limit counter on a token.\"\n ],\n \"discriminator\": [\n 152,\n 222,\n 104,\n 180,\n 163,\n 231,\n 152,\n 77\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"setRedemptionEpochStatus\",\n \"docs\": [\n \"Advance a redemption epoch through funding and processing states.\"\n ],\n \"discriminator\": [\n 143,\n 149,\n 239,\n 71,\n 206,\n 151,\n 223,\n 200\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\"\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true\n },\n {\n \"name\": \"epochRentRecipient\",\n \"docs\": [\n \"Must match `header.payer`, or `manager` when `payer` is default (legacy epochs).\"\n ],\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"setRedemptionEpochStatusParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"setTokenCircuitBreaker\",\n \"docs\": [\n \"Enable or disable the token circuit breaker.\",\n \"\",\n \"Activation: token's `cb_controller` or `admin`.\",\n \"Deactivation: token's `admin` only, time-gated.\"\n ],\n \"discriminator\": [\n 123,\n 100,\n 170,\n 97,\n 214,\n 192,\n 245,\n 151\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Activation: `TokenRoles::cb_controller()` or `TokenRoles::admin()`.\",\n \"Deactivation: admin only.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"setYieldingBankCircuitBreaker\",\n \"docs\": [\n \"Enable or disable the yielding-bank circuit breaker.\",\n \"\",\n \"Activation: bank's `cb_controller` or `admin`.\",\n \"Deactivation: bank's `admin` only, time-gated.\"\n ],\n \"discriminator\": [\n 25,\n 188,\n 1,\n 254,\n 63,\n 110,\n 168,\n 255\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Activation: `YieldingBankRoles::cb_controller()` or `YieldingBankRoles::admin()`.\",\n \"Deactivation: admin only.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"topUpUnlentReserves\",\n \"docs\": [\n \"Withdraw freed lending collateral into unlent reserves.\"\n ],\n \"discriminator\": [\n 249,\n 228,\n 192,\n 151,\n 48,\n 54,\n 74,\n 179\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemptionEpoch\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"collateralMint\"\n },\n {\n \"name\": \"collateralTokenAccount\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralTokenProgram\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateralMint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateralTokenProgram\"\n },\n {\n \"name\": \"lendingPositionUserAccount\"\n },\n {\n \"name\": \"lendingPositionCollateralReserve\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"topUpUnlentReservesParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"updateLendingPositionConfig\",\n \"docs\": [\n \"Update configuration for an existing lending position.\"\n ],\n \"discriminator\": [\n 164,\n 56,\n 56,\n 248,\n 51,\n 167,\n 213,\n 96\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"updateLendingPositionConfigParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"updateTokenConfiguration\",\n \"docs\": [\n \"Update token-level fee parameters and optionally the burn rate limit.\"\n ],\n \"discriminator\": [\n 115,\n 111,\n 91,\n 203,\n 143,\n 224,\n 71,\n 136\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Token admin for full configuration updates, manager for\",\n \"`fee_drip_max_apy_bps` only, or curator for curator-fee-wallet updates.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"managerRole\",\n \"docs\": [\n \"Optional new manager. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curatorFeeWallet\",\n \"docs\": [\n \"Optional new curator fee wallet. `None` means \\\"no change\\\".\",\n \"Rotatable by the token admin or the token curator.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cbControllerRole\",\n \"docs\": [\n \"Optional new circuit-breaker activator. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curatorRole\",\n \"docs\": [\n \"Optional new curator. Must be in `WHITELISTED_CURATORS`.\",\n \"`None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"adminRole\",\n \"docs\": [\n \"Optional new admin. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"updateTokenConfigurationParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"updateTokenMetadata\",\n \"docs\": [\n \"Update on-chain metadata for a token's mint via Metaplex Token Metadata CPI.\"\n ],\n \"discriminator\": [\n 243,\n 6,\n 8,\n 23,\n 126,\n 181,\n 251,\n 158\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"token\"\n },\n {\n \"name\": \"mint\"\n }\n ],\n \"args\": [\n {\n \"name\": \"ixRefs\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"updateYieldingBankConfig\",\n \"docs\": [\n \"Update yielding-bank configuration parameters.\"\n ],\n \"discriminator\": [\n 236,\n 3,\n 226,\n 53,\n 30,\n 160,\n 216,\n 24\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"yieldingBank\",\n \"writable\": true\n },\n {\n \"name\": \"defaultRedemptionMint\",\n \"docs\": [\n \"New default redemption mint.\"\n ]\n },\n {\n \"name\": \"managerRole\",\n \"docs\": [\n \"Optional new manager. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cbControllerRole\",\n \"docs\": [\n \"Optional new circuit-breaker activator. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curatorRole\",\n \"docs\": [\n \"Optional new curator. Must be in `WHITELISTED_CURATORS`.\",\n \"`None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"adminRole\",\n \"docs\": [\n \"Optional new admin. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"updateYieldingBankConfigParams\"\n }\n }\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"asyncBurnRequest\",\n \"discriminator\": [\n 211,\n 147,\n 62,\n 108,\n 20,\n 247,\n 245,\n 141\n ]\n },\n {\n \"name\": \"cpiPlanAccount\",\n \"discriminator\": [\n 23,\n 23,\n 187,\n 18,\n 208,\n 103,\n 156,\n 246\n ]\n },\n {\n \"name\": \"redemptionEpoch\",\n \"discriminator\": [\n 84,\n 63,\n 161,\n 230,\n 59,\n 183,\n 69,\n 214\n ]\n },\n {\n \"name\": \"token\",\n \"discriminator\": [\n 131,\n 254,\n 39,\n 144,\n 4,\n 179,\n 134,\n 127\n ]\n },\n {\n \"name\": \"yieldingBank\",\n \"discriminator\": [\n 236,\n 126,\n 167,\n 207,\n 44,\n 134,\n 113,\n 92\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 8000,\n \"name\": \"unauthorized\",\n \"msg\": \"Signer is not authorized\"\n },\n {\n \"code\": 8001,\n \"name\": \"invalidFeeBps\",\n \"msg\": \"Fee basis points exceed maximum\"\n },\n {\n \"code\": 8002,\n \"name\": \"unsupportedInterestDistribution\",\n \"msg\": \"Interest distribution mode is not yet supported\"\n },\n {\n \"code\": 8003,\n \"name\": \"invalidMintAuthority\",\n \"msg\": \"Mint authority must be the token PDA\"\n },\n {\n \"code\": 8004,\n \"name\": \"decimalsMismatch\",\n \"msg\": \"yToken mint decimals must equal collateral mint decimals\"\n },\n {\n \"code\": 8005,\n \"name\": \"missingYieldingBank\",\n \"msg\": \"Missing yielding bank account in remaining_accounts for active carry position\"\n },\n {\n \"code\": 8006,\n \"name\": \"invalidYieldingBank\",\n \"msg\": \"Yielding bank account does not match expected PDA for carry position\"\n },\n {\n \"code\": 8007,\n \"name\": \"noAvailableSlot\",\n \"msg\": \"No available slot to register a new holding or position\"\n },\n {\n \"code\": 8008,\n \"name\": \"duplicateAllocationMint\",\n \"msg\": \"Active asset holding already exists for the provided mint\"\n },\n {\n \"code\": 8009,\n \"name\": \"stalePrice\",\n \"msg\": \"Token price is stale — call refresh_token_state before mint/burn\"\n },\n {\n \"code\": 8010,\n \"name\": \"invalidCollateralAccount\",\n \"msg\": \"Collateral token account mint does not match the token's registered collateral mint\"\n },\n {\n \"code\": 8011,\n \"name\": \"invalidTokenAccount\",\n \"msg\": \"Token account address does not match the expected ATA\"\n },\n {\n \"code\": 8012,\n \"name\": \"freezeAuthoritySet\",\n \"msg\": \"Mint freeze authority must be None\"\n },\n {\n \"code\": 8013,\n \"name\": \"zeroDeposit\",\n \"msg\": \"Deposit amount must be greater than zero\"\n },\n {\n \"code\": 8014,\n \"name\": \"depositLimitExceeded\",\n \"msg\": \"Deposit would exceed the token's configured collateral deposit limit\"\n },\n {\n \"code\": 8015,\n \"name\": \"depositLimitBelowCurrentCollateral\",\n \"msg\": \"Deposit limit cannot be set below current total collateral backing\"\n },\n {\n \"code\": 8016,\n \"name\": \"zeroBurnAmount\",\n \"msg\": \"Burn amount must be greater than zero\"\n },\n {\n \"code\": 8017,\n \"name\": \"zeroCollateral\",\n \"msg\": \"Burn amount is too small — collateral payout rounds to zero\"\n },\n {\n \"code\": 8018,\n \"name\": \"zeroPrice\",\n \"msg\": \"Token price is zero — minting is not possible\"\n },\n {\n \"code\": 8019,\n \"name\": \"utilizationRateExceedsTarget\",\n \"msg\": \"Lending position utilization rate exceeds its target\"\n },\n {\n \"code\": 8020,\n \"name\": \"invalidUtilizationRateCondition\",\n \"msg\": \"Unable to perform carry position update\"\n },\n {\n \"code\": 8021,\n \"name\": \"invalidLendingPosition\",\n \"msg\": \"Lending position index is out of range or inactive\"\n },\n {\n \"code\": 8022,\n \"name\": \"invalidLendingPositionConfig\",\n \"msg\": \"Lending position configuration is invalid\"\n },\n {\n \"code\": 8023,\n \"name\": \"invalidLendingPositionAccount\",\n \"msg\": \"Lending position user account does not match expected\"\n },\n {\n \"code\": 8024,\n \"name\": \"invalidBorrowCpiCount\",\n \"msg\": \"Borrow CPIs must contain exactly one borrow instruction\"\n },\n {\n \"code\": 8025,\n \"name\": \"invalidCpiTypes\",\n \"msg\": \"CPI types do not match the required category sequence\"\n },\n {\n \"code\": 8026,\n \"name\": \"missingDebtOracle\",\n \"msg\": \"Missing debt oracle account in remaining_accounts for active lending position\"\n },\n {\n \"code\": 8027,\n \"name\": \"insufficientUnlentCollateral\",\n \"msg\": \"Insufficient unlent collateral for the requested amount\"\n },\n {\n \"code\": 8028,\n \"name\": \"cpiProgramPlatformMismatch\",\n \"msg\": \"CPI program does not match the lending position's configured platform\"\n },\n {\n \"code\": 8029,\n \"name\": \"carryPositionSlippage\",\n \"msg\": \"Carry position TVL slippage exceeds allowed threshold\"\n },\n {\n \"code\": 8030,\n \"name\": \"noFeesToCollect\",\n \"msg\": \"No pending protocol fees to collect\"\n },\n {\n \"code\": 8031,\n \"name\": \"zeroRepay\",\n \"msg\": \"Repay amount must be greater than zero\"\n },\n {\n \"code\": 8032,\n \"name\": \"missingRepayAmount\",\n \"msg\": \"Either repay_amount or yb_ix_refs must be provided\"\n },\n {\n \"code\": 8033,\n \"name\": \"repayAmountMismatch\",\n \"msg\": \"Actual repay amount does not match the expected repay amount\"\n },\n {\n \"code\": 8034,\n \"name\": \"rebalanceAmountMismatch\",\n \"msg\": \"Actual rebalance amount does not match the expected rebalance amount\"\n },\n {\n \"code\": 8035,\n \"name\": \"rebalanceFlashMintsMatch\",\n \"msg\": \"Flash-loan-wrapped rebalance requires distinct source and destination debt mints\"\n },\n {\n \"code\": 8036,\n \"name\": \"rebalanceFlashRepayUnderfunded\",\n \"msg\": \"Post-swap source-debt balance is insufficient to fund the flash repay\"\n },\n {\n \"code\": 8037,\n \"name\": \"rebalanceFlashFeeTooHigh\",\n \"msg\": \"Flash-loan fee exceeds the maximum allowed (5 bps of flash-borrow principal)\"\n },\n {\n \"code\": 8038,\n \"name\": \"zeroBorrowAfterRebalance\",\n \"msg\": \"Destination lending position has zero debt after rebalance borrow\"\n },\n {\n \"code\": 8039,\n \"name\": \"balanceChangeMismatch\",\n \"msg\": \"Token account balance change does not match the lending position state change\"\n },\n {\n \"code\": 8040,\n \"name\": \"nonRedemptionMintDrained\",\n \"msg\": \"Swap drained a non-redemption-mint asset holding\"\n },\n {\n \"code\": 8041,\n \"name\": \"invalidSourceAssetHoldingMint\",\n \"msg\": \"Source asset holding mint cannot match the lending position debt mint\"\n },\n {\n \"code\": 8042,\n \"name\": \"missingRemainingAccount\",\n \"msg\": \"Required account missing from remaining_accounts\"\n },\n {\n \"code\": 8043,\n \"name\": \"duplicateAccount\",\n \"msg\": \"Duplicate account provided\"\n },\n {\n \"code\": 8044,\n \"name\": \"externalLiquidityTvlMismatch\",\n \"msg\": \"Asset-holding TVL losses were not matched by offsetting TVL increases\"\n },\n {\n \"code\": 8045,\n \"name\": \"invalidDefaultRedemptionMint\",\n \"msg\": \"Default redemption mint must match an existing yielding-bank asset holding\"\n },\n {\n \"code\": 8046,\n \"name\": \"insufficientCarryShares\",\n \"msg\": \"Cannot burn more shares than the carry position holds\"\n },\n {\n \"code\": 8047,\n \"name\": \"collectInterestInsolvency\",\n \"msg\": \"Collecting interest would leave carry position unable to cover debt\"\n },\n {\n \"code\": 8048,\n \"name\": \"carryPositionNotFound\",\n \"msg\": \"No carry position found for the given yielding bank\"\n },\n {\n \"code\": 8049,\n \"name\": \"invalidMintSupply\",\n \"msg\": \"yToken mint must have zero supply at creation\"\n },\n {\n \"code\": 8050,\n \"name\": \"unsupportedYieldingBankMint\",\n \"msg\": \"Mint is not in the supported yielding bank mints list\"\n },\n {\n \"code\": 8051,\n \"name\": \"recollateralizeLossNotNeeded\",\n \"msg\": \"Recollateralization not needed — debt does not exceed carry\"\n },\n {\n \"code\": 8052,\n \"name\": \"recollateralizeLossInsufficient\",\n \"msg\": \"Recollateralization incomplete — carry assets do not cover debt after instruction\"\n },\n {\n \"code\": 8053,\n \"name\": \"recollateralizeLossOvershot\",\n \"msg\": \"Recollateralization overshot — carry exceeds debt by more than the allowed threshold\"\n },\n {\n \"code\": 8054,\n \"name\": \"recollateralizeLossSlippage\",\n \"msg\": \"Recollateralization slippage — collateral and debt USD changes diverge beyond tolerance\"\n },\n {\n \"code\": 8055,\n \"name\": \"recollateralizeLossNoChange\",\n \"msg\": \"Recollateralization failed — no change in collateral or debt on the lending position\"\n },\n {\n \"code\": 8056,\n \"name\": \"invalidTvlBiasBps\",\n \"msg\": \"Deprecated stub: InvalidTvlBiasBps — retained only for Anchor error discriminant compatibility (TVL bias removed)\"\n },\n {\n \"code\": 8057,\n \"name\": \"claimIncentivesNoChange\",\n \"msg\": \"Claimed incentives did not increase the expected token account or produce collateral\"\n },\n {\n \"code\": 8058,\n \"name\": \"unsupportedIncentivePlatform\",\n \"msg\": \"Only Kamino lending positions currently support incentive claims\"\n },\n {\n \"code\": 8059,\n \"name\": \"invalidBurnAdjacentNextInstruction\",\n \"msg\": \"Burn-adjacent decrease_carry_position requires the immediate next instruction to be a matching burn_token\"\n },\n {\n \"code\": 8060,\n \"name\": \"missingBurnAdjacentWithdrawParams\",\n \"msg\": \"Burn-adjacent decrease_carry_position requires burn_token withdraw params when unlent collateral is insufficient\"\n },\n {\n \"code\": 8061,\n \"name\": \"curatorMismatch\",\n \"msg\": \"Yielding bank curator does not match token curator\"\n },\n {\n \"code\": 8062,\n \"name\": \"curatorNotWhitelisted\",\n \"msg\": \"Signer is not in the whitelisted curators list\"\n },\n {\n \"code\": 8063,\n \"name\": \"roleAccountNotEmpty\",\n \"msg\": \"Role account is not empty\"\n },\n {\n \"code\": 8064,\n \"name\": \"roleAccountInvalidOwner\",\n \"msg\": \"Role account owner must be the System Program\"\n },\n {\n \"code\": 8065,\n \"name\": \"duplicateFeeWallet\",\n \"msg\": \"Curator and protocol fee wallets must be distinct\"\n },\n {\n \"code\": 8066,\n \"name\": \"invalidLendingPositionState\",\n \"msg\": \"Newly created lending position must have zero collateral and debt\"\n },\n {\n \"code\": 8067,\n \"name\": \"invalidIncentiveOracle\",\n \"msg\": \"Incentive mint, oracle, or oracle type does not match the lending position's debt config\"\n },\n {\n \"code\": 8068,\n \"name\": \"invalidCollateralIncentiveOracle\",\n \"msg\": \"Incentive oracle / oracle type does not match the token's collateral config\"\n },\n {\n \"code\": 8069,\n \"name\": \"missingYieldingBankAccounts\",\n \"msg\": \"Yielding-bank accounts (yielding_bank, yielding_bank_incentive_ata, incentive_oracle) are required when the incentive mint matches the lending position's debt mint\"\n },\n {\n \"code\": 8070,\n \"name\": \"missingCollateralIncentiveOracle\",\n \"msg\": \"incentive_oracle is required when the incentive mint matches the token's collateral mint\"\n },\n {\n \"code\": 8071,\n \"name\": \"missingFeeWalletAccounts\",\n \"msg\": \"fee_wallet and fee_wallet_incentive_ata are required when the incentive mint is neither the debt mint nor the collateral mint\"\n },\n {\n \"code\": 8072,\n \"name\": \"invalidFeeWallet\",\n \"msg\": \"fee_wallet does not match the token's curator fee wallet\"\n },\n {\n \"code\": 8073,\n \"name\": \"mintAllNativeSol\",\n \"msg\": \"Cannot mint all when collateral is native SOL — user needs SOL for transaction fees and rent\"\n },\n {\n \"code\": 8074,\n \"name\": \"untrackedDebtResidue\",\n \"msg\": \"Untracked debt tokens remain on the yielding bank after repay — register a debt-mint holding or ensure the swap output equals repay amount\"\n },\n {\n \"code\": 8075,\n \"name\": \"dcpSwapOverOutput\",\n \"msg\": \"DCP swap output exceeds repay amount tolerance\"\n },\n {\n \"code\": 8076,\n \"name\": \"invalidRedemptionEpochStatus\",\n \"msg\": \"Redemption epoch is not in the required status\"\n },\n {\n \"code\": 8077,\n \"name\": \"asyncBurnRequestOutOfOrder\",\n \"msg\": \"Async burn request is not next in FIFO order\"\n },\n {\n \"code\": 8078,\n \"name\": \"asyncBurnRequestAlreadyProcessed\",\n \"msg\": \"Async burn request has already been processed\"\n },\n {\n \"code\": 8079,\n \"name\": \"insufficientRedemptionEpochFunding\",\n \"msg\": \"Async redemption epoch has insufficient funded collateral\"\n },\n {\n \"code\": 8080,\n \"name\": \"asyncBurnRequestAlreadyExists\",\n \"msg\": \"Async burn request already exists\"\n },\n {\n \"code\": 8081,\n \"name\": \"redemptionEpochAlreadyFunded\",\n \"msg\": \"Redemption epoch is already fully funded\"\n },\n {\n \"code\": 8082,\n \"name\": \"redemptionEpochNotFullyFunded\",\n \"msg\": \"Redemption epoch must be fully funded before transitioning to Processing\"\n },\n {\n \"code\": 8083,\n \"name\": \"invalidCpiPlanAccount\",\n \"msg\": \"CPI plan account does not match the expected PDA\"\n },\n {\n \"code\": 8084,\n \"name\": \"unsupportedDebtMint\",\n \"msg\": \"New debt mint is not in the list of supported YB mints\"\n },\n {\n \"code\": 8085,\n \"name\": \"missingUsdcHolding\",\n \"msg\": \"Yielding bank holds USD* but has no USDC holding to convert its price basis\"\n },\n {\n \"code\": 8086,\n \"name\": \"asyncBurnRequestNotCancellable\",\n \"msg\": \"Async burn request is not cancellable yet\"\n },\n {\n \"code\": 8087,\n \"name\": \"feeDripConfigRequired\",\n \"msg\": \"Reserved fee-drip configuration error\"\n },\n {\n \"code\": 8088,\n \"name\": \"rebalanceRateLimited\",\n \"msg\": \"Lending position was rebalanced within the rate-limit window — try again later\"\n }\n ],\n \"types\": [\n {\n \"name\": \"amountRateLimit\",\n \"docs\": [\n \"Rolling amount rate limit using a tumbling time window.\",\n \"\",\n \"Tracks cumulative usage within a fixed-length window. When the window\",\n \"expires, the counter resets automatically on the next operation.\",\n \"\",\n \"The rate limit is only enforced when both `max_amount > 0` and\",\n \"`window_duration_secs > 0`. The default (all zeros) means no rate limiting.\"\n ],\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"maxAmount\",\n \"docs\": [\n \"Maximum cumulative amount allowed within one window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"windowDurationSecs\",\n \"docs\": [\n \"Length of the rate-limit window in seconds.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountUsed\",\n \"docs\": [\n \"Cumulative amount consumed in the current window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"windowStartTs\",\n \"docs\": [\n \"Unix timestamp when the current window started.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"assetAllocationConfig\",\n \"docs\": [\n \"Configuration for the collateral or debt side of an external lending position.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"assetConfig\",\n \"docs\": [\n \"Configuration for adding a new yield-bearing asset holding.\",\n \"\",\n \"Fields derivable from the mint account (`mint`, `decimals`, `token_program`)\",\n \"are provided separately — the mint is a named account on the instruction,\",\n \"and the handler reads decimals/token_program from it.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"oracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"externalLiquidity\",\n \"type\": {\n \"defined\": {\n \"name\": \"externalLiquidityType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"assetHolding\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the asset (e.g. base stablecoin, LST, or receipt token)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of the asset held (in native mint units)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Current USD price of the asset\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account for price resolution\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"docs\": [\n \"Decimal precision of the mint\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"externalLiquidity\",\n \"docs\": [\n \"In some cases, an asset will not have all funds sitting in the PDA's token account.\",\n \"We track the source type and read the accounts accordingly to know the full amount\",\n \"owed to the yielding bank onchain.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"externalLiquidityType\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"timeCreated\",\n \"docs\": [\n \"Unix timestamp when this holding was registered.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"assetHoldingData\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"asyncBurnRequest\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"asyncBurnRequestHeader\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"asyncBurnRequestAccounting\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"asyncBurnRequestAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"yTokenAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"grossCollateralClaim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocolFee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"curatorFee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"asyncBurnRequestHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"epoch\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"user\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Account that funded the request PDA rent. Receives the rent back when\",\n \"the request is closed during `process_async_burn`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"epochId\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sequence\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"requestTs\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"burnRateLimitUpdateParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"maxAmount\",\n \"docs\": [\n \"Maximum cumulative burn amount allowed within one window (0 to disable).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"windowDurationSecs\",\n \"docs\": [\n \"Length of the rate-limit window in seconds (0 to disable).\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"burnTokenParams\",\n \"docs\": [\n \"Instruction params for burning yTokens.\",\n \"\",\n \"Use [`BurnTokenParams::Sync`] when unlent collateral is sufficient without\",\n \"allocating redemption epoch PDAs. Use [`BurnTokenParams::Async`] when async\",\n \"fallback PDAs are passed — required when reserves may be insufficient at\",\n \"execution time.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"sync\",\n \"fields\": [\n {\n \"name\": \"burnAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"async\",\n \"fields\": [\n {\n \"name\": \"burnAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"epochId\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"requestSequence\",\n \"type\": \"u64\"\n }\n ]\n }\n ]\n }\n },\n {\n \"name\": \"claimIncentivesParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"docs\": [\n \"Optional prerequisite CPIs (e.g. Kamino reserve / obligation refresh)\",\n \"executed before the claim CPI.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"tokenIxRefs\",\n \"docs\": [\n \"CPI refs for the single claim-incentives action.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"docs\": [\n \"Lending position index whose farm rewards are being claimed. Used for\",\n \"platform routing and timelock enforcement.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"incentiveOracleType\",\n \"docs\": [\n \"Oracle type for pricing the claimed reward when the incentive mint\",\n \"matches the lending position's debt mint or the token's collateral\",\n \"mint. Ignored on the fee-wallet branch.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"collateralConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the underlying collateral asset backing this token\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Current USD price of the collateral asset (from oracle)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"unlentAmount\",\n \"docs\": [\n \"Amount of collateral held in reserve, not deployed to any lending position\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account used to price the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"lastRefreshedTs\",\n \"docs\": [\n \"Timestamp of the last oracle price refresh\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"secondaryOracle\",\n \"docs\": [\n \"Optional secondary oracle account. Used by composite oracle types that\",\n \"need a second input — e.g. `PythSplStake` stores the SPL stake pool\",\n \"account here while `oracle` holds the Pyth SOL/USD feed. Left as\",\n \"`Pubkey::default()` for single-account oracle types.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"cpiMapping\",\n \"docs\": [\n \"Mapping for extracting accounts from `remaining_accounts` across multiple CPIs.\",\n \"\",\n \"This struct enables efficient multi-CPI transactions by:\",\n \"1. Deduplicating all accounts into a single `remaining_accounts` pool\",\n \"2. Storing all indices for all CPIs in a single flattened vector\",\n \"3. Using `lengths` to slice the indices for each individual CPI\",\n \"\",\n \"# Example\",\n \"\",\n \"For 2 CPIs where CPI 0 needs 10 accounts and CPI 1 needs 8 accounts:\",\n \"```text\",\n \"indices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 5, 7, 10, 11, 12, 13, 14]\",\n \"lengths: [10, 8]\",\n \"\",\n \"CPI 0 uses indices[0..10]\",\n \"CPI 1 uses indices[10..18]\",\n \"```\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"indices\",\n \"docs\": [\n \"All indices into `remaining_accounts`, flattened across all CPIs.\"\n ],\n \"type\": \"bytes\"\n },\n {\n \"name\": \"lengths\",\n \"docs\": [\n \"Number of accounts for each CPI call.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"cpiPlan\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"cpiPlanHeader\"\n }\n }\n },\n {\n \"name\": \"refCount\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"refs\",\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"packedInstructionRefHeader\"\n }\n },\n 10\n ]\n }\n },\n {\n \"name\": \"cpiLengths\",\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n },\n {\n \"name\": \"cpiTypes\",\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n },\n {\n \"name\": \"accountIndices\",\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u8\",\n 1024\n ]\n },\n 4\n ]\n }\n },\n {\n \"name\": \"args\",\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u8\",\n 1024\n ]\n },\n 4\n ]\n }\n },\n {\n \"name\": \"tracked\",\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"cpiPlanAccount\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"packed\",\n \"type\": {\n \"defined\": {\n \"name\": \"cpiPlan\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"cpiPlanHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"uniqueId\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"createdTs\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"cpiRefs\",\n \"docs\": [\n \"References for CPI invocations.\",\n \"\",\n \"This structure contains all the information needed to invoke CPIs\",\n \"from a pool of deduplicated accounts.\",\n \"\",\n \"# Fields\",\n \"\",\n \"- `accounts`: Mapping of account indices per CPI slot (first = program)\",\n \"- `types`: Index into `CPI_REGISTRY` for each CPI slot\",\n \"- `args`: Packed CPI args buffer (u16-length-prefixed per slot)\",\n \"\",\n \"# Convention\",\n \"\",\n \"The **first account** in each CPI slot's account list is the **program**.\",\n \"This is validated during invocation against the registry entry.\",\n \"\",\n \"# Example\",\n \"\",\n \"```text\",\n \"CpiRefs {\",\n \"accounts: CpiMapping {\",\n \"indices: [5, 0, 1, 2, 3, 4, 8, 6, 7, 0, 1],\",\n \"lengths: [6, 5],\",\n \"},\",\n \"types: [0, 2], // CPI 0 = PERENA_MINT, CPI 1 = JUPITER_SWAP\",\n \"args: [16, 0, ..16 bytes.., 0xFF, 0xFF],\",\n \"}\",\n \"```\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"accounts\",\n \"docs\": [\n \"Account indices per CPI (first account of each CPI = program).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"cpiMapping\"\n }\n }\n },\n {\n \"name\": \"types\",\n \"docs\": [\n \"Index into `CPI_REGISTRY` for each CPI slot.\"\n ],\n \"type\": \"bytes\"\n },\n {\n \"name\": \"args\",\n \"docs\": [\n \"Packed CPI args — `[u16 LE length][data]` per slot.\",\n \"0xFFFF = skip (program-provided), 0 = no-args, N = N bytes of client data.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"createCpiPlanParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"uniqueId\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"createdTs\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"refs\",\n \"type\": {\n \"vec\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"createTokenLendingPositionParams\",\n \"docs\": [\n \"Parameters for initializing a new lending position on a Token.\",\n \"\",\n \"Account-backed values (`protocol_user_acc`, `collateral_reserve`,\",\n \"`debt_oracle`) are read from the `lp_position` composite on the `Accounts`\",\n \"struct rather than duplicated in this params struct.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lendingPlatform\",\n \"docs\": [\n \"Which lending protocol (e.g. Kamino, Marginfi)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPlatform\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debtReserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"targetUtilizationRateBps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationAboveTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationBelowTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry trade increase is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"debtMint\",\n \"docs\": [\n \"Debt asset configuration\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debtDecimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"debtTokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"debtOracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"tokenCpis\",\n \"docs\": [\n \"Optional setup CPIs (e.g. Kamino init_user_metadata, init_obligation,\",\n \"refresh_reserve, refresh_obligation) signed by the Token PDA and\",\n \"executed before the final refresh. When provided, the on-chain refresh\",\n \"reads the freshly-initialized protocol user account; otherwise the\",\n \"refresh is a no-op over an empty account.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"createTokenParams\",\n \"docs\": [\n \"Parameters for creating a new yield token.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"interestDistribution\",\n \"type\": {\n \"defined\": {\n \"name\": \"interestDistribution\"\n }\n }\n },\n {\n \"name\": \"oracleConfig\",\n \"docs\": [\n \"Oracle configuration for pricing the collateral asset\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"oracleConfigDetails\"\n }\n }\n },\n {\n \"name\": \"feeConfig\",\n \"docs\": [\n \"Fee configuration\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"feeConfig\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"createYieldingBankParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"oracleConfig\",\n \"docs\": [\n \"Oracle configuration for pricing the base asset\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"oracleConfigDetails\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"debtAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the borrowed asset (e.g. USDC)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Outstanding debt amount in the debt mint's native units\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvlUsd\",\n \"docs\": [\n \"USD value of the outstanding debt\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Oracle price of the debt asset (scaled to 10^decimals)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account for the debt asset's price feed\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 1\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"decreaseCarryPositionParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"targetUtilizationRateBps\",\n \"docs\": [\n \"Optional manager-only target utilization override used for post-repay\",\n \"validation.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"ybIxRefs\",\n \"docs\": [\n \"Optional CPI refs for yielding-bank swap operations.\",\n \"When present, `source_asset_holding_index` must also be set.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"tokenIxRefs\",\n \"docs\": [\n \"Pre-built repay CPI refs (must contain exactly one Repay CPI).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"docs\": [\n \"Index into the token's lending_positions array for the position to repay.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"repayAmount\",\n \"docs\": [\n \"Amount of debt tokens to repay. `AMOUNT_ALL_SENTINEL` repays the maximum\",\n \"available amount, capped by current debt. When set with `yb_ix_refs`, the\",\n \"swap only runs if the yielding bank TA is short of this amount and\",\n \"non-manager swap over-output is capped. When None, `yb_ix_refs` must be\",\n \"present and the maximum available repay amount is derived from the\",\n \"yielding bank TA balance change; swap over-output remains on the yielding\",\n \"bank.\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"sourceAssetHoldingIndex\",\n \"docs\": [\n \"Index of the source asset holding for the swap (0 = base_asset, 1-12 = assets[0-11]).\",\n \"Required when `yb_ix_refs` is present. Non-manager signers may only\",\n \"specify a holding whose mint matches the bank's `default_redemption_mint`.\"\n ],\n \"type\": {\n \"option\": \"u8\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"externalLiquidityType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perenaWithdrawalQueue\"\n }\n ]\n }\n },\n {\n \"name\": \"externalPositionConfig\",\n \"docs\": [\n \"Configuration for adding a new external yielding position.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lendingPlatform\",\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPlatform\"\n }\n }\n },\n {\n \"name\": \"lendingType\",\n \"type\": {\n \"defined\": {\n \"name\": \"lendingType\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateralReserve\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debtReserve\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocolUserAcc\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral\",\n \"type\": {\n \"defined\": {\n \"name\": \"assetAllocationConfig\"\n }\n }\n },\n {\n \"name\": \"debt\",\n \"type\": {\n \"defined\": {\n \"name\": \"assetAllocationConfig\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"externalYielding\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lendingPlatform\",\n \"docs\": [\n \"Which lending protocol this position is on (e.g. Marginfi, Kamino)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPlatform\"\n }\n }\n },\n {\n \"name\": \"lendingType\",\n \"docs\": [\n \"Whether this is a direct lending market deposit or a vault position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"lendingType\"\n }\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateralReserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debtReserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocolUserAcc\",\n \"docs\": [\n \"The program's user/authority account on the lending protocol (e.g. marginfi account)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral\",\n \"docs\": [\n \"Collateral deposited into this external position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"assetHoldingData\"\n }\n }\n },\n {\n \"name\": \"debt\",\n \"docs\": [\n \"Debt borrowed against the collateral (zero if lending-only, non-zero if leveraged)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"assetHoldingData\"\n }\n }\n },\n {\n \"name\": \"tvl\",\n \"docs\": [\n \"Total value locked in this position (collateral value net of debt)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"timeCreated\",\n \"docs\": [\n \"Unix timestamp when this external yielding position slot was initialized.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 13\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"feeConfig\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performanceFeeBps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"mintingFeeBps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"burningFeeBps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"protocolMintBurnPctBps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the protocol (vs. into the token price)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curatorMintBurnPctBps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the curator (vs. into the token price).\",\n \"`protocol_mint_burn_pct_bps + curator_mint_burn_pct_bps` must be <= 10000.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curatorPerfPctBps\",\n \"docs\": [\n \"Curator's share of performance fees in basis points (rest goes to protocol).\",\n \"Must be <= 10000.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"feeDripMaxApyBps\",\n \"docs\": [\n \"Target and hard cap (bps) for annualized token-price growth during fee\",\n \"release. `0` parks absorbed fees.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"feeDripState\",\n \"docs\": [\n \"Runtime state for the mint/burn fee \\\"drip\\\".\",\n \"\",\n \"When a mint or burn absorbs a holder fee (the residual after protocol and\",\n \"curator take their split), the fee is not applied to the token price\",\n \"immediately. The fee is physically extra collateral held in the reserve;\",\n \"it is parked here as `undripped_fee_collateral` and **subtracted from the\",\n \"price basis** (`price = (collateral − undripped_fee_collateral) / total_supply`)\",\n \"so the price stays flat at absorption time. `refresh_token` then releases the\",\n \"buffer gradually, which grows the price numerator and lifts the price smoothly\",\n \"rather than in a spike.\",\n \"\",\n \"Denominating the buffer in collateral (rather than phantom supply) keeps each\",\n \"absorbed fee a fixed nominal amount: it does not ride the token's appreciation\",\n \"while parked, and ongoing yield flows fully to holders during the drip window.\",\n \"\",\n \"A configurable APY target and hard cap\",\n \"(`TokenFees::fee_drip_max_apy_bps`) releases enough of the buffer on each\",\n \"refresh to bring annualized price growth up to the target without exceeding\",\n \"it. A zero target parks the buffer.\",\n \"`recollateralize_loss` may consume this buffer after exhausting any pending\",\n \"unwind residual, before the deficit reaches ordinary collateral backing.\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"undrippedFeeCollateral\",\n \"docs\": [\n \"Collateral-denominated buffer of absorbed mint/burn holder fees not yet\",\n \"released into the price. Subtracted from the collateral in the price basis.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding0\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"apyReferencePrice\",\n \"docs\": [\n \"Token price at the start of the current APY measurement window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"apyReferenceTs\",\n \"docs\": [\n \"Timestamp at which `apy_reference_price` was recorded. The pair rolls\",\n \"only after the configured APY measurement window has elapsed.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 3\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"increaseCarryPositionParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"ixRefs\",\n \"docs\": [\n \"Pre-built borrow CPI refs (must contain exactly one Borrow CPI).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"docs\": [\n \"Index into the token's lending_positions array for the position to borrow against.\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"instructionRefs\",\n \"docs\": [\n \"Top-level references for an instruction.\",\n \"\",\n \"Bundles CPI refs (accounts, types, args) with tracked account indices.\",\n \"Passed as an instruction argument from TypeScript.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cpi\",\n \"docs\": [\n \"CPI account mapping, type indices, and packed args.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"cpiRefs\"\n }\n }\n },\n {\n \"name\": \"tracked\",\n \"docs\": [\n \"Indices into `remaining_accounts` for direct access.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"interestDistribution\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"intoTokenPrice\"\n },\n {\n \"name\": \"intoWallets\"\n }\n ]\n }\n },\n {\n \"name\": \"lendingPlatform\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"marginfi\"\n },\n {\n \"name\": \"kamino\"\n }\n ]\n }\n },\n {\n \"name\": \"lendingPosition\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"platform\",\n \"docs\": [\n \"Which lending protocol this position is on (e.g. Marginfi, Kamino)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPlatform\"\n }\n }\n },\n {\n \"name\": \"withdrawPending\",\n \"docs\": [\n \"This is a flag if we should allow this position's utilization rate to fall below target\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"podBool\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPositionAccounting\"\n }\n }\n },\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"lendingPositionConfig\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateralReserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debtReserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocolUserAcc\",\n \"docs\": [\n \"The program's user/authority account on the lending protocol\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"lastUpdatedTs\",\n \"docs\": [\n \"Unix timestamp of the last `rebalance_token` executed against this\",\n \"position. Enforces the `REBALANCE_TOKEN_RATE_LIMIT_SECS` cooldown so a\",\n \"single position cannot be rebalanced (and pay the swap spread) more than\",\n \"once per rate-limit window. Zero until the first rebalance.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 23\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lendingPositionAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"collateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"debt\",\n \"type\": {\n \"defined\": {\n \"name\": \"debtAccounting\"\n }\n }\n },\n {\n \"name\": \"ltvUtilizationRateBps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lendingPositionConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"targetUtilizationRateBps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationAboveTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationBelowTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry position increase is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 3\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lendingType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"lendingMarket\"\n },\n {\n \"name\": \"vault\"\n }\n ]\n }\n },\n {\n \"name\": \"lpRefIndices\",\n \"docs\": [\n \"Index-based account references for the token refresh.\",\n \"\",\n \"All indices point into the shared `remaining_accounts` pool, which is also\",\n \"used by `prerequisite_cpis`. Accounts are deduplicated across both: a single\",\n \"oracle or reserve referenced by multiple positions (or by a prereq CPI and a\",\n \"position) appears once in `remaining_accounts` and is referenced by index.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"userAccount\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collateralReserve\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"debtOracle\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"oracleConfigDetails\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"oracleType\",\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n },\n {\n \"name\": \"secondaryOracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (e.g. the\",\n \"SPL stake pool account for `PythSplStake`). `None` for single-account\",\n \"oracle types.\"\n ],\n \"type\": {\n \"option\": \"pubkey\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"oracleType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"pyth\"\n },\n {\n \"name\": \"switchboard\"\n },\n {\n \"name\": \"perenaBank\"\n },\n {\n \"name\": \"perenaTranche\"\n },\n {\n \"name\": \"pythSplStake\"\n },\n {\n \"name\": \"tpConsensusOracle\"\n }\n ]\n }\n },\n {\n \"name\": \"packedInstructionRefHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cpiStart\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"cpiCount\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"accountIndicesStart\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"accountIndicesLen\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"argsStart\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"argsLen\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"trackedStart\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"trackedLen\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"podBool\",\n \"repr\": {\n \"kind\": \"transparent\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n \"u8\"\n ]\n }\n },\n {\n \"name\": \"rebalanceTokenParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lpIndex\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"flashFeeAmount\",\n \"docs\": [\n \"Flash-loan fee in source-debt base units. The handler derives the\",\n \"total flash-repay amount from this plus the source-debt ATA balance\",\n \"observed at handler entry (= what Kamino actually flash-borrowed\",\n \"into the ATA), so the post-swap balance check, dust sweep, and\",\n \"SPL-Approve delegation always use the on-chain reality even if the\",\n \"off-chain builder's borrow size drifts.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"repayAmount\",\n \"docs\": [\n \"Source LP repay = flash-borrow principal. The handler injects this\",\n \"into the repay CPI loaded from the CPI plan.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"destinationDebtOracleType\",\n \"docs\": [\n \"Oracle type for the destination debt mint. Used to update the lending\",\n \"position's stored oracle_type when swapping debt in place, so that the\",\n \"post-borrow refresh reads the new oracle price correctly.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"oracleType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"recollateralizeLossParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh\",\n \"(e.g. Kamino refresh_reserve, refresh_obligation).\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"ixRefs\",\n \"docs\": [\n \"CPI refs for the Withdraw -> Swap -> Repay sequence (exactly 1 of each,\",\n \"in that order). All three CPIs share one deduplicated account pool.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"docs\": [\n \"Index into the token's lending_positions array.\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"redemptionEpoch\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"redemptionEpochHeader\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"redemptionEpochAccounting\"\n }\n }\n },\n {\n \"name\": \"processing\",\n \"type\": {\n \"defined\": {\n \"name\": \"redemptionEpochProcessing\"\n }\n }\n },\n {\n \"name\": \"sequencing\",\n \"type\": {\n \"defined\": {\n \"name\": \"redemptionEpochSequencing\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"redemptionEpochAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"grossCollateralClaim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"requestedYTokenAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"realizedUnwindLoss\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fundedCollateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"redemptionEpochHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"id\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"createdTs\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"closedTs\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"SOL rent payer for this epoch PDA's allocation (first async burn).\",\n \"Lamports from closing this account must return here (Pubkey::default =\",\n \"legacy epochs → refund may fall back to manager on-chain).\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"redemptionEpochProcessing\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"processedCollateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processedUnwindLoss\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processedYTokenAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processedGrossCollateralClaim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"redemptionEpochSequencing\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"requestCount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processedRequestCount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"nextRequestSequence\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"nextRequestSequenceToProcess\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"refreshTokenStateParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"accountRefs\",\n \"docs\": [\n \"Index-based account references into the shared `remaining_accounts` pool.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"tokenRefreshRefs\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"setRedemptionEpochStatusParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"token\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenConfig\"\n }\n }\n },\n {\n \"name\": \"collateral\",\n \"type\": {\n \"defined\": {\n \"name\": \"collateralConfig\"\n }\n }\n },\n {\n \"name\": \"fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenFees\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenAccounting\"\n }\n }\n },\n {\n \"name\": \"debtCarry\",\n \"docs\": [\n \"The carry positions — borrows debt against collateral deposited in lending positions,\",\n \"then converts proceeds into yielding banks to earn the yield spread\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"yieldingCarryPosition\"\n }\n },\n 3\n ]\n }\n },\n {\n \"name\": \"padding0\",\n \"type\": {\n \"array\": [\n \"u64\",\n 19\n ]\n }\n },\n {\n \"name\": \"lendingPositions\",\n \"docs\": [\n \"Lending positions across supported platforms (e.g. Marginfi, Kamino) where collateral is deployed\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"lendingPosition\"\n }\n },\n 6\n ]\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 128\n ]\n }\n },\n {\n \"name\": \"roles\",\n \"docs\": [\n \"Per-token authorization roles. Unset fields fall back to program-level defaults.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"tokenRoles\"\n }\n }\n },\n {\n \"name\": \"feeDrip\",\n \"docs\": [\n \"Mint/burn fee-drip buffer and APY reference. Appended after `roles`\",\n \"(consuming reserved padding) so all preceding field offsets stay stable\",\n \"for already-deployed accounts.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"feeDripState\"\n }\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 164\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"tokenAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"price\",\n \"docs\": [\n \"Price here is denominated in the collateral mint price\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalSupply\",\n \"docs\": [\n \"Total number of tokens in circulating supply (includes pending protocol fees)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvlUsd\",\n \"docs\": [\n \"Total TVL of a token. All collateral + YBA carry positions - debt\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"lastRefreshedTs\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"firstMintTs\",\n \"docs\": [\n \"First successful mint timestamp. Remains 0 until first mint.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingProtocolFees\",\n \"docs\": [\n \"Protocol fees accrued but not yet minted (collected via `collect_fees`\",\n \"by `PROTOCOL_ADMIN`).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingCuratorFees\",\n \"docs\": [\n \"Curator fees accrued but not yet minted (collected via `collect_fees`\",\n \"by the token's curator).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingAsyncRedemptionLiability\",\n \"docs\": [\n \"Collateral claim from async redemption requests that has not yet been\",\n \"settled. This is tracked separately so redemption-specific unwind losses\",\n \"can reduce the liability instead of active-holder NAV.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingAsyncBurnAmount\",\n \"docs\": [\n \"yTokens currently escrowed in async burn requests and awaiting FIFO\",\n \"fulfillment.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingAsyncFeeRetained\",\n \"docs\": [\n \"Protocol + curator fee tokens within `pending_async_burn_amount` that\",\n \"will be retained in `total_supply` as pending fees when the burn is\",\n \"processed.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pendingUnwindResidual\",\n \"docs\": [\n \"Collateral retained from async burners as their share of epoch unwind\",\n \"losses (`loss_for_request` in `process_async_burn`). Physically part of\",\n \"the collateral balance (and of `unlent_amount`), but earmarked to cover\",\n \"the carry−debt deficit the epoch unwind left behind. The price formula\",\n \"excludes `min(residual, hidden deficit)` from the price basis so the\",\n \"residual doesn't inflate the price while the deficit it funds is still\",\n \"clamped out of it; `recollateralize_loss` consumes it before undripped\",\n \"fees and ordinary collateral backing as the deficit is closed.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"tokenConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The token's mint address\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenProgram\",\n \"type\": {\n \"defined\": {\n \"name\": \"tokenProgram\"\n }\n }\n },\n {\n \"name\": \"interestDistribution\",\n \"docs\": [\n \"Determines how accrued interest is distributed — either folded into\",\n \"the token price (rebase) or sent directly to holder wallets\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"interestDistribution\"\n }\n }\n },\n {\n \"name\": \"circuitBreaker\",\n \"docs\": [\n \"When active, halts all activity except decrease_carry_position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"podBool\"\n }\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"padding3\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"burnRateLimit\",\n \"docs\": [\n \"Rolling rate limit on burn (redemption) volume per time window.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"amountRateLimit\"\n }\n }\n },\n {\n \"name\": \"depositLimit\",\n \"docs\": [\n \"Maximum total collateral backing the token, in raw collateral base units.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding4\",\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"tokenFees\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performanceFeeBps\",\n \"docs\": [\n \"The protocol fee to take against the yield that has been earned.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"mintingFeeBps\",\n \"docs\": [\n \"The fee to take when minting new tokens. Split between protocol, curator,\",\n \"and token price per the `*_mint_burn_pct_bps` fields below.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"burningFeeBps\",\n \"docs\": [\n \"The fee to take when burning tokens. Split between protocol, curator,\",\n \"and token price per the `*_mint_burn_pct_bps` fields below.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"protocolMintBurnPctBps\",\n \"docs\": [\n \"Protocol's share of mint/burn fees (in bps of `total_fee`).\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curatorMintBurnPctBps\",\n \"docs\": [\n \"Curator's share of mint/burn fees (in bps of `total_fee`).\",\n \"`protocol_mint_burn_pct_bps + curator_mint_burn_pct_bps <= 10_000`; the\",\n \"remainder (if any) stays in the token price.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curatorPerfPctBps\",\n \"docs\": [\n \"Curator's share of performance fees (in bps of `total_perf_fee`).\",\n \"The protocol implicitly receives `10_000 - curator_perf_pct_bps`.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"feeDripMaxApyBps\",\n \"docs\": [\n \"Target and hard cap (in bps) for annualized token-price growth during fee\",\n \"release. Refreshes release enough buffered collateral to approach this\",\n \"target without exceeding it. Natural yield can exceed the target and\",\n \"cannot be clawed back. `0` parks the buffer.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"tokenProgram\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"spl\"\n },\n {\n \"name\": \"token2022\"\n }\n ]\n }\n },\n {\n \"name\": \"tokenRefreshRefs\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lendingPositions\",\n \"docs\": [\n \"Per active lending position (in active-slot order, skipping inactive slots).\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": {\n \"name\": \"lpRefIndices\"\n }\n }\n }\n },\n {\n \"name\": \"carryPositions\",\n \"docs\": [\n \"Per active carry position (in active-slot order, skipping zero-share slots):\",\n \"index of the `YieldingBank` account in `remaining_accounts`.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"tokenRoles\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"padding0\",\n \"docs\": [\n \"Reserved space that keeps the role fields at their existing offsets\",\n \"after reducing the token's lending-position capacity.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"curator\",\n \"docs\": [\n \"The whitelisted curator that created this token. Treated as the \\\"creator\\\"\",\n \"and used for cross-state curator-match checks (e.g. increase_carry_position\",\n \"requires token.curator == yielding_bank.curator). Rotatable by the token\",\n \"admin to another `WHITELISTED_CURATORS` entry via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Authority for token-level config updates, metadata changes, fee edits, and\",\n \"circuit-breaker deactivation. Intended to be a multisig in production.\",\n \"Rotatable by the current admin via `update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Ops wallet authorized to run manager-gated instructions (increase_carry_position,\",\n \"collect_interest, rebalance, deposit_unlent_collateral, claim_incentives, etc).\",\n \"Rotatable via `update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fees\",\n \"docs\": [\n \"Curator's fee wallet — receives the curator's share of mint/burn fees and\",\n \"performance fees. Rotatable by the token admin or the token curator via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cbController\",\n \"docs\": [\n \"Emergency-halt wallet authorized to *activate* the circuit breaker.\",\n \"Deactivation remains admin-only and time-gated. Rotatable via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"topUpUnlentReservesParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisiteCpis\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"ixRefs\",\n \"type\": {\n \"defined\": {\n \"name\": \"instructionRefs\"\n }\n }\n },\n {\n \"name\": \"lendingPositionIndex\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"updateLendingPositionConfigParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lendingPositionIndex\",\n \"docs\": [\n \"Index into the token's lending_positions array\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"targetUtilizationRateBps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationAboveTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"maxDeviationBelowTargetUtilBps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry trade increase is allowed\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"updateTokenConfigurationParams\",\n \"docs\": [\n \"Parameters for updating a token's mutable configuration.\",\n \"\",\n \"Every field is optional: `None` means \\\"no change\\\". Oracle configuration is\",\n \"immutable after creation — use `create_token` to set the oracle, and deploy a\",\n \"new token if it needs to change.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performanceFeeBps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"mintingFeeBps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"burningFeeBps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"protocolMintBurnPctBps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the protocol (in bps)\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"curatorMintBurnPctBps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the curator (in bps)\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"curatorPerfPctBps\",\n \"docs\": [\n \"Curator's share of performance fees (in bps); protocol implicitly gets the rest.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"feeDripMaxApyBps\",\n \"docs\": [\n \"Target and hard cap (bps) for annualized price growth during fee release.\",\n \"`Some(0)` parks absorbed fees.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"burnRateLimit\",\n \"docs\": [\n \"Optional burn-rate-limit config update; omitted leaves the current config unchanged.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"burnRateLimitUpdateParams\"\n }\n }\n }\n },\n {\n \"name\": \"depositLimit\",\n \"docs\": [\n \"Optional cap on total collateral backing (unlent + lent), in raw collateral base units.\",\n \"`None` leaves unchanged. `Some(0)` disables the cap (same semantics as `mint_token`).\",\n \"For `Some(limit)` with `limit > 0`, `limit` must be ≥ that total or the instruction errors.\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"updateYieldingBankConfigParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": []\n }\n },\n {\n \"name\": \"yieldingAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"totalShares\",\n \"docs\": [\n \"Total shares outstanding across all token carry positions allocated to this bank,\",\n \"stored in raw share units scaled by the yielding bank `config.decimals`\",\n \"(canonically 8 share decimals).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sharePrice\",\n \"docs\": [\n \"Price per whole UI share, stored in the shared 8-decimal USD base unit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding1\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"lastRefreshedTs\",\n \"docs\": [\n \"Timestamp of the last share price refresh\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvl\",\n \"docs\": [\n \"Total TVL across all YBA holdings and external lending positions,\",\n \"normalized to the shared 8-decimal USD base unit ($1 = 100_000_000).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"lastRebalancedTs\",\n \"docs\": [\n \"Timestamp of the last time the yielding bank has been rebalanced\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 19\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"yieldingBank\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"yieldingConfig\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"yieldingAccounting\"\n }\n }\n },\n {\n \"name\": \"baseAsset\",\n \"docs\": [\n \"The base mint asset holding — always present, never cleared by cleanup.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"assetHolding\"\n }\n }\n },\n {\n \"name\": \"assets\",\n \"docs\": [\n \"Additional asset holdings beyond the base mint.\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"assetHolding\"\n }\n },\n 12\n ]\n }\n },\n {\n \"name\": \"externalYieldingPositions\",\n \"docs\": [\n \"Positions in external lending/vault protocols that actively generate yield\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"externalYielding\"\n }\n },\n 6\n ]\n }\n },\n {\n \"name\": \"roles\",\n \"docs\": [\n \"Per-yielding-bank authorization roles. Unset fields fall back to program-level defaults.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"yieldingBankRoles\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 144\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"yieldingBankAllocationConfig\",\n \"docs\": [\n \"Argument on `rebalance_yielding_bank` to register one new holding or\",\n \"external position that the rebalance will fund. At most one of the two\",\n \"fields may be `Some` per call.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"assetHolding\",\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"assetConfig\"\n }\n }\n }\n },\n {\n \"name\": \"externalPosition\",\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"externalPositionConfig\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"yieldingBankRoles\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"The whitelisted curator that created this yielding bank. Must match the\",\n \"token's curator when attaching a carry position via `increase_carry_position`.\",\n \"Rotatable by the bank admin to another `WHITELISTED_CURATORS` entry via\",\n \"`update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Authority for yielding-bank config updates and circuit-breaker deactivation.\",\n \"Intended to be a multisig in production. Rotatable by the current admin via\",\n \"`update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Ops wallet authorized to run manager-gated instructions on this bank\",\n \"(rebalance_yielding_bank, create_yielding_bank_allocation). Rotatable\",\n \"via `update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cbController\",\n \"docs\": [\n \"Emergency-halt wallet authorized to activate the circuit breaker. Deactivation\",\n \"remains admin-only and time-gated. Rotatable via `update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"yieldingCarryPosition\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"yieldingBaseMint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"yieldingBankId\",\n \"docs\": [\n \"Identifier for the yield-bearing asset bank this carry position is allocated to\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"shares\",\n \"docs\": [\n \"Number of shares held in the yielding bank (converts to underlying via bank share price)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvlUsd\",\n \"docs\": [\n \"Raw USD value of this token's share of the yielding bank, normalized to\",\n \"8-decimal USD ($1 = 100_000_000).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"yieldingConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"baseMint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"id\",\n \"docs\": [\n \"Unique identifier for this bank, used in PDA derivation and referenced by token carry positions\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"decimals\",\n \"docs\": [\n \"Share precision for `total_shares` accounting and share-price math.\",\n \"Canonically 8 so one whole UI share is priced in the shared TVL USD base unit.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"circuitBreaker\",\n \"docs\": [\n \"When active, halts all activity except decrease_carry_position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"podBool\"\n }\n }\n },\n {\n \"name\": \"padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"defaultRedemptionMint\",\n \"docs\": [\n \"The mint that should be used as the default source when redeeming\",\n \"(e.g. swapping from this mint into a debt mint during decrease_carry_position).\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"timeCreatedTs\",\n \"docs\": [\n \"Unix timestamp when this yielding bank was created.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 18\n ]\n }\n }\n ]\n }\n }\n ]\n};\n\n\nexport const IDL = {\n \"address\": \"7YPAKESPJ7zJAvBuk45ZVziu6tXGKoNzg3p9YpvrH6pX\",\n \"metadata\": {\n \"name\": \"long_yield_carry\",\n \"version\": \"0.1.0\",\n \"spec\": \"0.1.0\",\n \"description\": \"Created with Anchor\"\n },\n \"instructions\": [\n {\n \"name\": \"burn_token\",\n \"docs\": [\n \"Burn long-yield-carry tokens and redeem collateral.\"\n ],\n \"discriminator\": [\n 185,\n 165,\n 216,\n 246,\n 144,\n 31,\n 70,\n 74\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Pays SOL rent when async-path PDAs are created; must authorize lamport debits.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The yToken mint. Mutable because the burn CPI decrements total supply.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"user_token_account\",\n \"docs\": [\n \"User's yToken ATA — source of the burn. The user is the authority.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"user_collateral_account\",\n \"docs\": [\n \"User's collateral ATA — destination of the redeemed collateral.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral reserve — source of the collateral payout, and\",\n \"the destination for the collateral withdrawal in the liquidity path.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"request_token_account\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Token program for yToken operations (Burn).\"\n ]\n },\n {\n \"name\": \"collateral_token_program\",\n \"docs\": [\n \"Token program for collateral operations (Transfer).\"\n ]\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"BurnTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"cancel_async_burn\",\n \"docs\": [\n \"Cancel a timed-out FIFO-head async burn request while its epoch is still open.\"\n ],\n \"discriminator\": [\n 66,\n 63,\n 112,\n 221,\n 71,\n 95,\n 126,\n 145\n ],\n \"accounts\": [\n {\n \"name\": \"user\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Validated against the payer stored on the request at creation time.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"user_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"user\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"request_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"epoch_rent_recipient\",\n \"docs\": [\n \"Must match `redemption_epoch.header.payer`.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"claim_incentives\",\n \"docs\": [\n \"Claim lending-platform farm incentives and deposit them into the\",\n \"token's carry position via the yielding bank.\"\n ],\n \"discriminator\": [\n 79,\n 126,\n 77,\n 51,\n 253,\n 163,\n 193,\n 248\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"expected_incentive_mint\"\n },\n {\n \"name\": \"token_incentive_ata\",\n \"docs\": [\n \"Token PDA's ATA for the reward mint — receives rewards from the claim CPI.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentive_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expected_incentive_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"yielding_bank\",\n \"docs\": [\n \"Required only on the debt-mint branch. Self-pointer check happens\",\n \"inline at the start of `settle_debt_branch`.\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"yielding_bank_incentive_ata\",\n \"docs\": [\n \"Yielding bank's ATA for the reward mint — receives the transfer on the\",\n \"debt-mint branch.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yielding_bank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentive_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expected_incentive_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"incentive_oracle\",\n \"docs\": [\n \"`incentive_oracle_type`, which validates feed identity. Required on\",\n \"the debt-mint and collateral-mint branches.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"fee_wallet\",\n \"docs\": [\n \"Required on the fee-wallet branch.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"fee_wallet_incentive_ata\",\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"fee_wallet\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"incentive_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"expected_incentive_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"incentive_token_program\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"ClaimIncentivesParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"close_cpi_plan\",\n \"docs\": [\n \"Close an orphaned CPI plan PDA and return its rent to the manager.\",\n \"\",\n \"CPI plan accounts normally auto-close via `close = manager` when\",\n \"`rebalance_token` succeeds. This instruction reclaims rent from any\",\n \"plans that were left open due to a failed or interrupted transaction.\"\n ],\n \"discriminator\": [\n 47,\n 118,\n 163,\n 160,\n 199,\n 31,\n 63,\n 26\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Receives the reclaimed rent. Must be the original payer of this CPI plan.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpi_plan\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"collect_fees\",\n \"docs\": [\n \"Collect accrued protocol fees from a token.\"\n ],\n \"discriminator\": [\n 164,\n 152,\n 207,\n 99,\n 30,\n 186,\n 19,\n 182\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Must match either the token's `curator()` or the program-level `PROTOCOL_ADMIN`.\",\n \"If the signer is `PROTOCOL_ADMIN`, the protocol fee bucket and wallet are used\",\n \"(even when that key is also the curator). Otherwise, when the signer is the\",\n \"curator only, the curator bucket and curator fee wallet are used.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"writable\": true\n },\n {\n \"name\": \"fee_wallet\",\n \"docs\": [\n \"Fee wallet that receives the minted yTokens. Must match the\",\n \"`curator_fee_wallet()` wallet when signed by the curator, or\",\n \"`protocol_fee_wallet()` when signed by PROTOCOL_ADMIN.\"\n ]\n },\n {\n \"name\": \"fee_wallet_token_account\",\n \"docs\": [\n \"Fee wallet's yToken ATA — created on first collection, reused thereafter\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"fee_wallet\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"collect_interest\",\n \"docs\": [\n \"Realize accrued yield from a carry position.\"\n ],\n \"discriminator\": [\n 238,\n 101,\n 253,\n 86,\n 160,\n 25,\n 16,\n 134\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"collateral_oracle\",\n \"docs\": [\n \"Collateral oracle account — refreshed before slippage validation so the\",\n \"collateral USD value is checked against a fresh price.\"\n ]\n },\n {\n \"name\": \"secondary_collateral_oracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (the SPL\",\n \"stake pool account for `PythSplStake` collateral); omit otherwise.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"redemption_oracle\",\n \"docs\": [\n \"Oracle account for the yielding bank's default redemption mint —\",\n \"refreshed at the top of the handler so share accounting and the phase 4\",\n \"slippage check all use a live price basis that matches what the SDK\",\n \"planner read when sizing the swap input.\"\n ]\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral ATA — final destination for the swapped collateral\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"yb_collateral_token_account\",\n \"docs\": [\n \"Yielding bank's collateral ATA — receives the swap output before the\",\n \"handler transfers the delta into the token's collateral ATA.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yielding_bank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"curator_fee_wallet_collateral_account\",\n \"docs\": [\n \"Curator fee wallet's collateral ATA — receives the curator share of the performance fee.\",\n \"Address is the ATA of `token.roles.curator_fee_wallet()` for this collateral mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"protocol_fee_wallet_collateral_account\",\n \"docs\": [\n \"Protocol fee wallet's collateral ATA — receives the protocol share of the performance fee.\",\n \"Address is the ATA of `TokenRoles::protocol_fee_wallet()` for this collateral mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"yb_redemption_token_account\",\n \"docs\": [\n \"YB's ATA for the default redemption mint — snapshotted before and after\",\n \"swap CPIs to verify only this asset was sold.\",\n \"default_redemption_mint and the yielding bank PDA.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"collateral_token_program\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_cpi_plan\",\n \"docs\": [\n \"Create a temporary zero-copy CPI plan account for a later instruction.\"\n ],\n \"discriminator\": [\n 176,\n 0,\n 30,\n 192,\n 57,\n 208,\n 40,\n 114\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpi_plan\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 112,\n 105,\n 32,\n 112,\n 108,\n 97,\n 110\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"params.unique_id\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"params.created_ts\"\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"CreateCpiPlanParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_token\",\n \"docs\": [\n \"Create a new token and initialize its configuration.\"\n ],\n \"discriminator\": [\n 84,\n 52,\n 204,\n 228,\n 24,\n 140,\n 234,\n 75\n ],\n \"accounts\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"Curator that will own this token. Must be in `WHITELISTED_CURATORS`.\",\n \"Pays for account rent.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"admin_role\",\n \"docs\": [\n \"Admin multisig. `None` means \\\"use the feature-gated default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"manager_role\",\n \"docs\": [\n \"Manager ops wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curator_fee_wallet\",\n \"docs\": [\n \"Curator fee wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cb_controller_role\",\n \"docs\": [\n \"Circuit-breaker activator. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"yToken mint — must be pre-created with its authority set to the token PDA\",\n \"and freeze authority set to None. This allows the caller to set mint metadata\",\n \"(name, symbol, icon) before registering the token with the program.\"\n ]\n },\n {\n \"name\": \"collateral_mint\",\n \"docs\": [\n \"The underlying collateral mint (e.g. wSOL)\"\n ]\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's account for holding unlent collateral reserves\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Token program for the yToken mint\"\n ]\n },\n {\n \"name\": \"collateral_token_program\",\n \"docs\": [\n \"Token program for the collateral mint\"\n ]\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"CreateTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_token_lending_position\",\n \"docs\": [\n \"Register a new lending position for a token.\"\n ],\n \"discriminator\": [\n 32,\n 13,\n 223,\n 159,\n 125,\n 144,\n 219,\n 148\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"lp_position\",\n \"accounts\": [\n {\n \"name\": \"user_account\",\n \"docs\": [\n \"The lending position's user/authority account.\"\n ]\n },\n {\n \"name\": \"collateral_reserve\",\n \"docs\": [\n \"The lending position's collateral reserve/bank account.\"\n ]\n },\n {\n \"name\": \"debt_oracle\",\n \"docs\": [\n \"Oracle for the lending position's debt asset.\"\n ]\n }\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"CreateTokenLendingPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_yielding_bank\",\n \"docs\": [\n \"Create a new yielding bank for a base mint.\"\n ],\n \"discriminator\": [\n 123,\n 125,\n 211,\n 195,\n 102,\n 102,\n 90,\n 7\n ],\n \"accounts\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"Curator that will own this yielding bank. Must be in `WHITELISTED_CURATORS`.\",\n \"Pays for account rent.\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"admin_role\",\n \"docs\": [\n \"Admin multisig. `None` means \\\"use the feature-gated default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"manager_role\",\n \"docs\": [\n \"Manager ops wallet. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cb_controller_role\",\n \"docs\": [\n \"Circuit-breaker activator. `None` means \\\"use default\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n },\n {\n \"name\": \"base_mint\"\n },\n {\n \"name\": \"default_redemption_mint\",\n \"docs\": [\n \"The mint used as the default source when redeeming from the bank.\",\n \"Validated as a real SPL Token / Token-2022 mint by Anchor deserialization.\"\n ]\n },\n {\n \"name\": \"base_mint_token_account\",\n \"docs\": [\n \"Base mint ATA owned by the yielding bank PDA — created so refresh\",\n \"can always read the token balance for the base asset.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yielding_bank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"base_mint_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"base_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"base_mint_token_program\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"CreateYieldingBankParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_yielding_bank_allocation\",\n \"docs\": [\n \"Add a new asset holding or external position to a yielding bank.\"\n ],\n \"discriminator\": [\n 213,\n 191,\n 99,\n 159,\n 78,\n 2,\n 87,\n 126\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n },\n {\n \"name\": \"allocation_mint\",\n \"docs\": [\n \"Mint for the new asset holding.\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"YieldingBankAllocationConfig\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"credit_unlent_to_redemption_epoch\",\n \"docs\": [\n \"Credit already-unlent collateral reserves to a redemption epoch.\"\n ],\n \"discriminator\": [\n 236,\n 123,\n 27,\n 93,\n 229,\n 169,\n 214,\n 129\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"collateral_token_account\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"decrease_carry_position\",\n \"docs\": [\n \"Reduce a carry position and return freed collateral.\"\n ],\n \"discriminator\": [\n 109,\n 115,\n 98,\n 62,\n 206,\n 179,\n 42,\n 145\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true,\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"DecreaseCarryPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"deposit_unlent_collateral\",\n \"docs\": [\n \"Lend idle collateral from a token into a lending position.\"\n ],\n \"discriminator\": [\n 112,\n 210,\n 209,\n 249,\n 61,\n 231,\n 192,\n 207\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral reserve — balance is checked before and\",\n \"after the deposit CPI to derive the actual deposited amount.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_program\"\n },\n {\n \"name\": \"lending_position_user_account\",\n \"docs\": [\n \"The lending position's user/authority account on the lending protocol\",\n \"(e.g. Kamino obligation). Used to refresh the position after deposit.\"\n ]\n },\n {\n \"name\": \"lending_position_collateral_reserve\",\n \"docs\": [\n \"The lending protocol's collateral reserve account. Used to convert\",\n \"cTokens to underlying liquidity during the post-deposit refresh.\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"ix_refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"increase_carry_position\",\n \"docs\": [\n \"Increase a carry position using borrowed funds.\"\n ],\n \"discriminator\": [\n 216,\n 191,\n 255,\n 166,\n 144,\n 169,\n 3,\n 187\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"docs\": [\n \"via `remaining_accounts`, so the role check is enforced at runtime in\",\n \"the handler rather than by an Anchor constraint here.\"\n ],\n \"signer\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"IncreaseCarryPositionParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"mint_token\",\n \"docs\": [\n \"Deposit collateral and mint long-yield-carry tokens.\"\n ],\n \"discriminator\": [\n 172,\n 137,\n 183,\n 14,\n 207,\n 110,\n 234,\n 56\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The yToken mint — authority is the token PDA\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"collateral_mint\",\n \"docs\": [\n \"Collateral mint (for TransferChecked decimals validation)\"\n ]\n },\n {\n \"name\": \"user_collateral_account\",\n \"docs\": [\n \"User's collateral ATA (source of deposit)\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"user_token_account\",\n \"docs\": [\n \"User's yToken ATA — must be created before calling this instruction\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"signer\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral reserve\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Token program for yToken operations (MintTo)\"\n ]\n },\n {\n \"name\": \"collateral_token_program\",\n \"docs\": [\n \"Token program for collateral operations (TransferChecked)\"\n ]\n }\n ],\n \"args\": [\n {\n \"name\": \"deposit_amount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"process_async_burn\",\n \"docs\": [\n \"Process the next FIFO async burn request in an epoch.\"\n ],\n \"discriminator\": [\n 95,\n 36,\n 6,\n 2,\n 122,\n 146,\n 3,\n 215\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Validated against the payer stored on the request at creation time.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true\n },\n {\n \"name\": \"request\",\n \"writable\": true\n },\n {\n \"name\": \"user\",\n \"docs\": [\n \"collateral is wrapped SOL; otherwise unused except for identity binding.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"mint\",\n \"writable\": true\n },\n {\n \"name\": \"request_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"user_collateral_account\",\n \"docs\": [\n \"User's collateral ATA — required when collateral is not wrapped SOL.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"request_collateral_account\",\n \"docs\": [\n \"Request PDA's collateral ATA — required when collateral is wrapped SOL.\",\n \"The handler transfers WSOL here, then closes the account to unwrap into\",\n \"native SOL for `user`.\"\n ],\n \"writable\": true,\n \"optional\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"request\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"epoch_rent_recipient\",\n \"docs\": [\n \"marks fully processed epochs). Must match `header.payer`, or `manager`\",\n \"when `payer` is default (legacy epochs).\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"collateral_token_program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"rebalance_token\",\n \"docs\": [\n \"Rebalance a token across its carry positions.\"\n ],\n \"discriminator\": [\n 152,\n 98,\n 123,\n 66,\n 134,\n 191,\n 199,\n 73\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"cpi_plan\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RebalanceTokenParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"rebalance_yielding_bank\",\n \"docs\": [\n \"Rebalance a yielding bank across allocations and external liquidity.\"\n ],\n \"discriminator\": [\n 181,\n 53,\n 252,\n 136,\n 138,\n 104,\n 145,\n 137\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"ix_refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"recollateralize_loss\",\n \"docs\": [\n \"Recollateralize a loss by withdrawing collateral, swapping to debt, and repaying.\"\n ],\n \"discriminator\": [\n 98,\n 11,\n 43,\n 3,\n 199,\n 227,\n 100,\n 112\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral reserve — transit account for withdrawn collateral\",\n \"before it is swapped into the debt asset.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_oracle\",\n \"docs\": [\n \"Collateral oracle — refreshed to price the collateral decrease in USD\",\n \"for the slippage check against the debt decrease.\"\n ]\n },\n {\n \"name\": \"secondary_collateral_oracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (the SPL\",\n \"stake pool account for `PythSplStake` collateral); omit otherwise.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"lp_position\",\n \"accounts\": [\n {\n \"name\": \"user_account\",\n \"docs\": [\n \"The lending position's user/authority account.\"\n ]\n },\n {\n \"name\": \"collateral_reserve\",\n \"docs\": [\n \"The lending position's collateral reserve/bank account.\"\n ]\n },\n {\n \"name\": \"debt_oracle\",\n \"docs\": [\n \"Oracle for the lending position's debt asset.\"\n ]\n }\n ]\n },\n {\n \"name\": \"collateral_token_program\"\n },\n {\n \"name\": \"yielding_bank\",\n \"docs\": [\n \"Yielding bank to receive any excess debt tokens remaining after repay.\",\n \"Validated at runtime: base_mint must match the lending position's debt mint.\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"debt_mint\",\n \"docs\": [\n \"Debt mint for the lending position being recollateralized.\"\n ]\n },\n {\n \"name\": \"token_lp_debt_ta\",\n \"docs\": [\n \"Token PDA's ATA for the debt mint — receives swap output, source for repay and deposit.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debt_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debt_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"yielding_bank_ta\",\n \"docs\": [\n \"Yielding bank's ATA for the debt mint — destination for excess debt token deposit.\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"yielding_bank\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debt_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"debt_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"debt_token_program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RecollateralizeLossParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"refresh_token_state\",\n \"docs\": [\n \"Refresh token pricing and lending-position state.\"\n ],\n \"discriminator\": [\n 229,\n 167,\n 209,\n 155,\n 223,\n 252,\n 150,\n 188\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"collateral_oracle\",\n \"docs\": [\n \"Collateral oracle account — validated against the registered oracle\",\n \"via the OraclePriceFeed trait's refresh_price method.\"\n ]\n },\n {\n \"name\": \"secondary_collateral_oracle\",\n \"docs\": [\n \"Optional secondary oracle account, required only for composite oracle\",\n \"types. For `PythSplStake` collateral this is the SPL stake pool account;\",\n \"omit for single-account oracle types.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"collateral_token_account\",\n \"docs\": [\n \"Token PDA's collateral reserve account (read actual on-chain balance)\"\n ],\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RefreshTokenStateParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"refresh_yielding_bank\",\n \"docs\": [\n \"Refresh yielding-bank asset balances, prices, and share accounting.\"\n ],\n \"discriminator\": [\n 234,\n 183,\n 180,\n 72,\n 113,\n 250,\n 213,\n 76\n ],\n \"accounts\": [\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"reset_token_burn_rate_limit\",\n \"docs\": [\n \"Reset the burn rate limit counter on a token.\"\n ],\n \"discriminator\": [\n 152,\n 222,\n 104,\n 180,\n 163,\n 231,\n 152,\n 77\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"set_redemption_epoch_status\",\n \"docs\": [\n \"Advance a redemption epoch through funding and processing states.\"\n ],\n \"discriminator\": [\n 143,\n 149,\n 239,\n 71,\n 206,\n 151,\n 223,\n 200\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\"\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true\n },\n {\n \"name\": \"epoch_rent_recipient\",\n \"docs\": [\n \"Must match `header.payer`, or `manager` when `payer` is default (legacy epochs).\"\n ],\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SetRedemptionEpochStatusParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"set_token_circuit_breaker\",\n \"docs\": [\n \"Enable or disable the token circuit breaker.\",\n \"\",\n \"Activation: token's `cb_controller` or `admin`.\",\n \"Deactivation: token's `admin` only, time-gated.\"\n ],\n \"discriminator\": [\n 123,\n 100,\n 170,\n 97,\n 214,\n 192,\n 245,\n 151\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Activation: `TokenRoles::cb_controller()` or `TokenRoles::admin()`.\",\n \"Deactivation: admin only.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"set_yielding_bank_circuit_breaker\",\n \"docs\": [\n \"Enable or disable the yielding-bank circuit breaker.\",\n \"\",\n \"Activation: bank's `cb_controller` or `admin`.\",\n \"Deactivation: bank's `admin` only, time-gated.\"\n ],\n \"discriminator\": [\n 25,\n 188,\n 1,\n 254,\n 63,\n 110,\n 168,\n 255\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Activation: `YieldingBankRoles::cb_controller()` or `YieldingBankRoles::admin()`.\",\n \"Deactivation: admin only.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"top_up_unlent_reserves\",\n \"docs\": [\n \"Withdraw freed lending collateral into unlent reserves.\"\n ],\n \"discriminator\": [\n 249,\n 228,\n 192,\n 151,\n 48,\n 54,\n 74,\n 179\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"redemption_epoch\",\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"collateral_mint\"\n },\n {\n \"name\": \"collateral_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"token\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_token_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"collateral_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"collateral_token_program\"\n },\n {\n \"name\": \"lending_position_user_account\"\n },\n {\n \"name\": \"lending_position_collateral_reserve\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"TopUpUnlentReservesParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_lending_position_config\",\n \"docs\": [\n \"Update configuration for an existing lending position.\"\n ],\n \"discriminator\": [\n 164,\n 56,\n 56,\n 248,\n 51,\n 167,\n 213,\n 96\n ],\n \"accounts\": [\n {\n \"name\": \"manager\",\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"UpdateLendingPositionConfigParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_token_configuration\",\n \"docs\": [\n \"Update token-level fee parameters and optionally the burn rate limit.\"\n ],\n \"discriminator\": [\n 115,\n 111,\n 91,\n 203,\n 143,\n 224,\n 71,\n 136\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Token admin for full configuration updates, manager for\",\n \"`fee_drip_max_apy_bps` only, or curator for curator-fee-wallet updates.\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token\",\n \"writable\": true\n },\n {\n \"name\": \"manager_role\",\n \"docs\": [\n \"Optional new manager. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curator_fee_wallet\",\n \"docs\": [\n \"Optional new curator fee wallet. `None` means \\\"no change\\\".\",\n \"Rotatable by the token admin or the token curator.\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cb_controller_role\",\n \"docs\": [\n \"Optional new circuit-breaker activator. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curator_role\",\n \"docs\": [\n \"Optional new curator. Must be in `WHITELISTED_CURATORS`.\",\n \"`None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"admin_role\",\n \"docs\": [\n \"Optional new admin. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"UpdateTokenConfigurationParams\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_token_metadata\",\n \"docs\": [\n \"Update on-chain metadata for a token's mint via Metaplex Token Metadata CPI.\"\n ],\n \"discriminator\": [\n 243,\n 6,\n 8,\n 23,\n 126,\n 181,\n 251,\n 158\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"token\"\n },\n {\n \"name\": \"mint\"\n }\n ],\n \"args\": [\n {\n \"name\": \"ix_refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_yielding_bank_config\",\n \"docs\": [\n \"Update yielding-bank configuration parameters.\"\n ],\n \"discriminator\": [\n 236,\n 3,\n 226,\n 53,\n 30,\n 160,\n 216,\n 24\n ],\n \"accounts\": [\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"yielding_bank\",\n \"writable\": true\n },\n {\n \"name\": \"default_redemption_mint\",\n \"docs\": [\n \"New default redemption mint.\"\n ]\n },\n {\n \"name\": \"manager_role\",\n \"docs\": [\n \"Optional new manager. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"cb_controller_role\",\n \"docs\": [\n \"Optional new circuit-breaker activator. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"curator_role\",\n \"docs\": [\n \"Optional new curator. Must be in `WHITELISTED_CURATORS`.\",\n \"`None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n },\n {\n \"name\": \"admin_role\",\n \"docs\": [\n \"Optional new admin. `None` means \\\"no change\\\".\"\n ],\n \"optional\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"UpdateYieldingBankConfigParams\"\n }\n }\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"AsyncBurnRequest\",\n \"discriminator\": [\n 211,\n 147,\n 62,\n 108,\n 20,\n 247,\n 245,\n 141\n ]\n },\n {\n \"name\": \"CpiPlanAccount\",\n \"discriminator\": [\n 23,\n 23,\n 187,\n 18,\n 208,\n 103,\n 156,\n 246\n ]\n },\n {\n \"name\": \"RedemptionEpoch\",\n \"discriminator\": [\n 84,\n 63,\n 161,\n 230,\n 59,\n 183,\n 69,\n 214\n ]\n },\n {\n \"name\": \"Token\",\n \"discriminator\": [\n 131,\n 254,\n 39,\n 144,\n 4,\n 179,\n 134,\n 127\n ]\n },\n {\n \"name\": \"YieldingBank\",\n \"discriminator\": [\n 236,\n 126,\n 167,\n 207,\n 44,\n 134,\n 113,\n 92\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 8000,\n \"name\": \"Unauthorized\",\n \"msg\": \"Signer is not authorized\"\n },\n {\n \"code\": 8001,\n \"name\": \"InvalidFeeBps\",\n \"msg\": \"Fee basis points exceed maximum\"\n },\n {\n \"code\": 8002,\n \"name\": \"UnsupportedInterestDistribution\",\n \"msg\": \"Interest distribution mode is not yet supported\"\n },\n {\n \"code\": 8003,\n \"name\": \"InvalidMintAuthority\",\n \"msg\": \"Mint authority must be the token PDA\"\n },\n {\n \"code\": 8004,\n \"name\": \"DecimalsMismatch\",\n \"msg\": \"yToken mint decimals must equal collateral mint decimals\"\n },\n {\n \"code\": 8005,\n \"name\": \"MissingYieldingBank\",\n \"msg\": \"Missing yielding bank account in remaining_accounts for active carry position\"\n },\n {\n \"code\": 8006,\n \"name\": \"InvalidYieldingBank\",\n \"msg\": \"Yielding bank account does not match expected PDA for carry position\"\n },\n {\n \"code\": 8007,\n \"name\": \"NoAvailableSlot\",\n \"msg\": \"No available slot to register a new holding or position\"\n },\n {\n \"code\": 8008,\n \"name\": \"DuplicateAllocationMint\",\n \"msg\": \"Active asset holding already exists for the provided mint\"\n },\n {\n \"code\": 8009,\n \"name\": \"StalePrice\",\n \"msg\": \"Token price is stale — call refresh_token_state before mint/burn\"\n },\n {\n \"code\": 8010,\n \"name\": \"InvalidCollateralAccount\",\n \"msg\": \"Collateral token account mint does not match the token's registered collateral mint\"\n },\n {\n \"code\": 8011,\n \"name\": \"InvalidTokenAccount\",\n \"msg\": \"Token account address does not match the expected ATA\"\n },\n {\n \"code\": 8012,\n \"name\": \"FreezeAuthoritySet\",\n \"msg\": \"Mint freeze authority must be None\"\n },\n {\n \"code\": 8013,\n \"name\": \"ZeroDeposit\",\n \"msg\": \"Deposit amount must be greater than zero\"\n },\n {\n \"code\": 8014,\n \"name\": \"DepositLimitExceeded\",\n \"msg\": \"Deposit would exceed the token's configured collateral deposit limit\"\n },\n {\n \"code\": 8015,\n \"name\": \"DepositLimitBelowCurrentCollateral\",\n \"msg\": \"Deposit limit cannot be set below current total collateral backing\"\n },\n {\n \"code\": 8016,\n \"name\": \"ZeroBurnAmount\",\n \"msg\": \"Burn amount must be greater than zero\"\n },\n {\n \"code\": 8017,\n \"name\": \"ZeroCollateral\",\n \"msg\": \"Burn amount is too small — collateral payout rounds to zero\"\n },\n {\n \"code\": 8018,\n \"name\": \"ZeroPrice\",\n \"msg\": \"Token price is zero — minting is not possible\"\n },\n {\n \"code\": 8019,\n \"name\": \"UtilizationRateExceedsTarget\",\n \"msg\": \"Lending position utilization rate exceeds its target\"\n },\n {\n \"code\": 8020,\n \"name\": \"InvalidUtilizationRateCondition\",\n \"msg\": \"Unable to perform carry position update\"\n },\n {\n \"code\": 8021,\n \"name\": \"InvalidLendingPosition\",\n \"msg\": \"Lending position index is out of range or inactive\"\n },\n {\n \"code\": 8022,\n \"name\": \"InvalidLendingPositionConfig\",\n \"msg\": \"Lending position configuration is invalid\"\n },\n {\n \"code\": 8023,\n \"name\": \"InvalidLendingPositionAccount\",\n \"msg\": \"Lending position user account does not match expected\"\n },\n {\n \"code\": 8024,\n \"name\": \"InvalidBorrowCpiCount\",\n \"msg\": \"Borrow CPIs must contain exactly one borrow instruction\"\n },\n {\n \"code\": 8025,\n \"name\": \"InvalidCpiTypes\",\n \"msg\": \"CPI types do not match the required category sequence\"\n },\n {\n \"code\": 8026,\n \"name\": \"MissingDebtOracle\",\n \"msg\": \"Missing debt oracle account in remaining_accounts for active lending position\"\n },\n {\n \"code\": 8027,\n \"name\": \"InsufficientUnlentCollateral\",\n \"msg\": \"Insufficient unlent collateral for the requested amount\"\n },\n {\n \"code\": 8028,\n \"name\": \"CpiProgramPlatformMismatch\",\n \"msg\": \"CPI program does not match the lending position's configured platform\"\n },\n {\n \"code\": 8029,\n \"name\": \"CarryPositionSlippage\",\n \"msg\": \"Carry position TVL slippage exceeds allowed threshold\"\n },\n {\n \"code\": 8030,\n \"name\": \"NoFeesToCollect\",\n \"msg\": \"No pending protocol fees to collect\"\n },\n {\n \"code\": 8031,\n \"name\": \"ZeroRepay\",\n \"msg\": \"Repay amount must be greater than zero\"\n },\n {\n \"code\": 8032,\n \"name\": \"MissingRepayAmount\",\n \"msg\": \"Either repay_amount or yb_ix_refs must be provided\"\n },\n {\n \"code\": 8033,\n \"name\": \"RepayAmountMismatch\",\n \"msg\": \"Actual repay amount does not match the expected repay amount\"\n },\n {\n \"code\": 8034,\n \"name\": \"RebalanceAmountMismatch\",\n \"msg\": \"Actual rebalance amount does not match the expected rebalance amount\"\n },\n {\n \"code\": 8035,\n \"name\": \"RebalanceFlashMintsMatch\",\n \"msg\": \"Flash-loan-wrapped rebalance requires distinct source and destination debt mints\"\n },\n {\n \"code\": 8036,\n \"name\": \"RebalanceFlashRepayUnderfunded\",\n \"msg\": \"Post-swap source-debt balance is insufficient to fund the flash repay\"\n },\n {\n \"code\": 8037,\n \"name\": \"RebalanceFlashFeeTooHigh\",\n \"msg\": \"Flash-loan fee exceeds the maximum allowed (5 bps of flash-borrow principal)\"\n },\n {\n \"code\": 8038,\n \"name\": \"ZeroBorrowAfterRebalance\",\n \"msg\": \"Destination lending position has zero debt after rebalance borrow\"\n },\n {\n \"code\": 8039,\n \"name\": \"BalanceChangeMismatch\",\n \"msg\": \"Token account balance change does not match the lending position state change\"\n },\n {\n \"code\": 8040,\n \"name\": \"NonRedemptionMintDrained\",\n \"msg\": \"Swap drained a non-redemption-mint asset holding\"\n },\n {\n \"code\": 8041,\n \"name\": \"InvalidSourceAssetHoldingMint\",\n \"msg\": \"Source asset holding mint cannot match the lending position debt mint\"\n },\n {\n \"code\": 8042,\n \"name\": \"MissingRemainingAccount\",\n \"msg\": \"Required account missing from remaining_accounts\"\n },\n {\n \"code\": 8043,\n \"name\": \"DuplicateAccount\",\n \"msg\": \"Duplicate account provided\"\n },\n {\n \"code\": 8044,\n \"name\": \"ExternalLiquidityTvlMismatch\",\n \"msg\": \"Asset-holding TVL losses were not matched by offsetting TVL increases\"\n },\n {\n \"code\": 8045,\n \"name\": \"InvalidDefaultRedemptionMint\",\n \"msg\": \"Default redemption mint must match an existing yielding-bank asset holding\"\n },\n {\n \"code\": 8046,\n \"name\": \"InsufficientCarryShares\",\n \"msg\": \"Cannot burn more shares than the carry position holds\"\n },\n {\n \"code\": 8047,\n \"name\": \"CollectInterestInsolvency\",\n \"msg\": \"Collecting interest would leave carry position unable to cover debt\"\n },\n {\n \"code\": 8048,\n \"name\": \"CarryPositionNotFound\",\n \"msg\": \"No carry position found for the given yielding bank\"\n },\n {\n \"code\": 8049,\n \"name\": \"InvalidMintSupply\",\n \"msg\": \"yToken mint must have zero supply at creation\"\n },\n {\n \"code\": 8050,\n \"name\": \"UnsupportedYieldingBankMint\",\n \"msg\": \"Mint is not in the supported yielding bank mints list\"\n },\n {\n \"code\": 8051,\n \"name\": \"RecollateralizeLossNotNeeded\",\n \"msg\": \"Recollateralization not needed — debt does not exceed carry\"\n },\n {\n \"code\": 8052,\n \"name\": \"RecollateralizeLossInsufficient\",\n \"msg\": \"Recollateralization incomplete — carry assets do not cover debt after instruction\"\n },\n {\n \"code\": 8053,\n \"name\": \"RecollateralizeLossOvershot\",\n \"msg\": \"Recollateralization overshot — carry exceeds debt by more than the allowed threshold\"\n },\n {\n \"code\": 8054,\n \"name\": \"RecollateralizeLossSlippage\",\n \"msg\": \"Recollateralization slippage — collateral and debt USD changes diverge beyond tolerance\"\n },\n {\n \"code\": 8055,\n \"name\": \"RecollateralizeLossNoChange\",\n \"msg\": \"Recollateralization failed — no change in collateral or debt on the lending position\"\n },\n {\n \"code\": 8056,\n \"name\": \"InvalidTvlBiasBps\",\n \"msg\": \"Deprecated stub: InvalidTvlBiasBps — retained only for Anchor error discriminant compatibility (TVL bias removed)\"\n },\n {\n \"code\": 8057,\n \"name\": \"ClaimIncentivesNoChange\",\n \"msg\": \"Claimed incentives did not increase the expected token account or produce collateral\"\n },\n {\n \"code\": 8058,\n \"name\": \"UnsupportedIncentivePlatform\",\n \"msg\": \"Only Kamino lending positions currently support incentive claims\"\n },\n {\n \"code\": 8059,\n \"name\": \"InvalidBurnAdjacentNextInstruction\",\n \"msg\": \"Burn-adjacent decrease_carry_position requires the immediate next instruction to be a matching burn_token\"\n },\n {\n \"code\": 8060,\n \"name\": \"MissingBurnAdjacentWithdrawParams\",\n \"msg\": \"Burn-adjacent decrease_carry_position requires burn_token withdraw params when unlent collateral is insufficient\"\n },\n {\n \"code\": 8061,\n \"name\": \"CuratorMismatch\",\n \"msg\": \"Yielding bank curator does not match token curator\"\n },\n {\n \"code\": 8062,\n \"name\": \"CuratorNotWhitelisted\",\n \"msg\": \"Signer is not in the whitelisted curators list\"\n },\n {\n \"code\": 8063,\n \"name\": \"RoleAccountNotEmpty\",\n \"msg\": \"Role account is not empty\"\n },\n {\n \"code\": 8064,\n \"name\": \"RoleAccountInvalidOwner\",\n \"msg\": \"Role account owner must be the System Program\"\n },\n {\n \"code\": 8065,\n \"name\": \"DuplicateFeeWallet\",\n \"msg\": \"Curator and protocol fee wallets must be distinct\"\n },\n {\n \"code\": 8066,\n \"name\": \"InvalidLendingPositionState\",\n \"msg\": \"Newly created lending position must have zero collateral and debt\"\n },\n {\n \"code\": 8067,\n \"name\": \"InvalidIncentiveOracle\",\n \"msg\": \"Incentive mint, oracle, or oracle type does not match the lending position's debt config\"\n },\n {\n \"code\": 8068,\n \"name\": \"InvalidCollateralIncentiveOracle\",\n \"msg\": \"Incentive oracle / oracle type does not match the token's collateral config\"\n },\n {\n \"code\": 8069,\n \"name\": \"MissingYieldingBankAccounts\",\n \"msg\": \"Yielding-bank accounts (yielding_bank, yielding_bank_incentive_ata, incentive_oracle) are required when the incentive mint matches the lending position's debt mint\"\n },\n {\n \"code\": 8070,\n \"name\": \"MissingCollateralIncentiveOracle\",\n \"msg\": \"incentive_oracle is required when the incentive mint matches the token's collateral mint\"\n },\n {\n \"code\": 8071,\n \"name\": \"MissingFeeWalletAccounts\",\n \"msg\": \"fee_wallet and fee_wallet_incentive_ata are required when the incentive mint is neither the debt mint nor the collateral mint\"\n },\n {\n \"code\": 8072,\n \"name\": \"InvalidFeeWallet\",\n \"msg\": \"fee_wallet does not match the token's curator fee wallet\"\n },\n {\n \"code\": 8073,\n \"name\": \"MintAllNativeSol\",\n \"msg\": \"Cannot mint all when collateral is native SOL — user needs SOL for transaction fees and rent\"\n },\n {\n \"code\": 8074,\n \"name\": \"UntrackedDebtResidue\",\n \"msg\": \"Untracked debt tokens remain on the yielding bank after repay — register a debt-mint holding or ensure the swap output equals repay amount\"\n },\n {\n \"code\": 8075,\n \"name\": \"DcpSwapOverOutput\",\n \"msg\": \"DCP swap output exceeds repay amount tolerance\"\n },\n {\n \"code\": 8076,\n \"name\": \"InvalidRedemptionEpochStatus\",\n \"msg\": \"Redemption epoch is not in the required status\"\n },\n {\n \"code\": 8077,\n \"name\": \"AsyncBurnRequestOutOfOrder\",\n \"msg\": \"Async burn request is not next in FIFO order\"\n },\n {\n \"code\": 8078,\n \"name\": \"AsyncBurnRequestAlreadyProcessed\",\n \"msg\": \"Async burn request has already been processed\"\n },\n {\n \"code\": 8079,\n \"name\": \"InsufficientRedemptionEpochFunding\",\n \"msg\": \"Async redemption epoch has insufficient funded collateral\"\n },\n {\n \"code\": 8080,\n \"name\": \"AsyncBurnRequestAlreadyExists\",\n \"msg\": \"Async burn request already exists\"\n },\n {\n \"code\": 8081,\n \"name\": \"RedemptionEpochAlreadyFunded\",\n \"msg\": \"Redemption epoch is already fully funded\"\n },\n {\n \"code\": 8082,\n \"name\": \"RedemptionEpochNotFullyFunded\",\n \"msg\": \"Redemption epoch must be fully funded before transitioning to Processing\"\n },\n {\n \"code\": 8083,\n \"name\": \"InvalidCpiPlanAccount\",\n \"msg\": \"CPI plan account does not match the expected PDA\"\n },\n {\n \"code\": 8084,\n \"name\": \"UnsupportedDebtMint\",\n \"msg\": \"New debt mint is not in the list of supported YB mints\"\n },\n {\n \"code\": 8085,\n \"name\": \"MissingUsdcHolding\",\n \"msg\": \"Yielding bank holds USD* but has no USDC holding to convert its price basis\"\n },\n {\n \"code\": 8086,\n \"name\": \"AsyncBurnRequestNotCancellable\",\n \"msg\": \"Async burn request is not cancellable yet\"\n },\n {\n \"code\": 8087,\n \"name\": \"FeeDripConfigRequired\",\n \"msg\": \"Reserved fee-drip configuration error\"\n },\n {\n \"code\": 8088,\n \"name\": \"RebalanceRateLimited\",\n \"msg\": \"Lending position was rebalanced within the rate-limit window — try again later\"\n }\n ],\n \"types\": [\n {\n \"name\": \"AmountRateLimit\",\n \"docs\": [\n \"Rolling amount rate limit using a tumbling time window.\",\n \"\",\n \"Tracks cumulative usage within a fixed-length window. When the window\",\n \"expires, the counter resets automatically on the next operation.\",\n \"\",\n \"The rate limit is only enforced when both `max_amount > 0` and\",\n \"`window_duration_secs > 0`. The default (all zeros) means no rate limiting.\"\n ],\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"max_amount\",\n \"docs\": [\n \"Maximum cumulative amount allowed within one window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"window_duration_secs\",\n \"docs\": [\n \"Length of the rate-limit window in seconds.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount_used\",\n \"docs\": [\n \"Cumulative amount consumed in the current window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"window_start_ts\",\n \"docs\": [\n \"Unix timestamp when the current window started.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"AssetAllocationConfig\",\n \"docs\": [\n \"Configuration for the collateral or debt side of an external lending position.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AssetConfig\",\n \"docs\": [\n \"Configuration for adding a new yield-bearing asset holding.\",\n \"\",\n \"Fields derivable from the mint account (`mint`, `decimals`, `token_program`)\",\n \"are provided separately — the mint is a named account on the instruction,\",\n \"and the handler reads decimals/token_program from it.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"external_liquidity\",\n \"type\": {\n \"defined\": {\n \"name\": \"ExternalLiquidityType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AssetHolding\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the asset (e.g. base stablecoin, LST, or receipt token)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of the asset held (in native mint units)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Current USD price of the asset\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account for price resolution\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"docs\": [\n \"Decimal precision of the mint\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"external_liquidity\",\n \"docs\": [\n \"In some cases, an asset will not have all funds sitting in the PDA's token account.\",\n \"We track the source type and read the accounts accordingly to know the full amount\",\n \"owed to the yielding bank onchain.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"ExternalLiquidityType\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"time_created\",\n \"docs\": [\n \"Unix timestamp when this holding was registered.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"AssetHoldingData\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"AsyncBurnRequest\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"AsyncBurnRequestHeader\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"AsyncBurnRequestAccounting\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AsyncBurnRequestAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"y_token_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"gross_collateral_claim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"curator_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"AsyncBurnRequestHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"epoch\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"user\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Account that funded the request PDA rent. Receives the rent back when\",\n \"the request is closed during `process_async_burn`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"epoch_id\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sequence\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"request_ts\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"BurnRateLimitUpdateParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"max_amount\",\n \"docs\": [\n \"Maximum cumulative burn amount allowed within one window (0 to disable).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"window_duration_secs\",\n \"docs\": [\n \"Length of the rate-limit window in seconds (0 to disable).\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BurnTokenParams\",\n \"docs\": [\n \"Instruction params for burning yTokens.\",\n \"\",\n \"Use [`BurnTokenParams::Sync`] when unlent collateral is sufficient without\",\n \"allocating redemption epoch PDAs. Use [`BurnTokenParams::Async`] when async\",\n \"fallback PDAs are passed — required when reserves may be insufficient at\",\n \"execution time.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Sync\",\n \"fields\": [\n {\n \"name\": \"burn_amount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"Async\",\n \"fields\": [\n {\n \"name\": \"burn_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"epoch_id\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"request_sequence\",\n \"type\": \"u64\"\n }\n ]\n }\n ]\n }\n },\n {\n \"name\": \"ClaimIncentivesParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"docs\": [\n \"Optional prerequisite CPIs (e.g. Kamino reserve / obligation refresh)\",\n \"executed before the claim CPI.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"token_ix_refs\",\n \"docs\": [\n \"CPI refs for the single claim-incentives action.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"docs\": [\n \"Lending position index whose farm rewards are being claimed. Used for\",\n \"platform routing and timelock enforcement.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"incentive_oracle_type\",\n \"docs\": [\n \"Oracle type for pricing the claimed reward when the incentive mint\",\n \"matches the lending position's debt mint or the token's collateral\",\n \"mint. Ignored on the fee-wallet branch.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CollateralConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the underlying collateral asset backing this token\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Current USD price of the collateral asset (from oracle)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"unlent_amount\",\n \"docs\": [\n \"Amount of collateral held in reserve, not deployed to any lending position\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account used to price the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"last_refreshed_ts\",\n \"docs\": [\n \"Timestamp of the last oracle price refresh\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"secondary_oracle\",\n \"docs\": [\n \"Optional secondary oracle account. Used by composite oracle types that\",\n \"need a second input — e.g. `PythSplStake` stores the SPL stake pool\",\n \"account here while `oracle` holds the Pyth SOL/USD feed. Left as\",\n \"`Pubkey::default()` for single-account oracle types.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"CpiMapping\",\n \"docs\": [\n \"Mapping for extracting accounts from `remaining_accounts` across multiple CPIs.\",\n \"\",\n \"This struct enables efficient multi-CPI transactions by:\",\n \"1. Deduplicating all accounts into a single `remaining_accounts` pool\",\n \"2. Storing all indices for all CPIs in a single flattened vector\",\n \"3. Using `lengths` to slice the indices for each individual CPI\",\n \"\",\n \"# Example\",\n \"\",\n \"For 2 CPIs where CPI 0 needs 10 accounts and CPI 1 needs 8 accounts:\",\n \"```text\",\n \"indices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 5, 7, 10, 11, 12, 13, 14]\",\n \"lengths: [10, 8]\",\n \"\",\n \"CPI 0 uses indices[0..10]\",\n \"CPI 1 uses indices[10..18]\",\n \"```\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"indices\",\n \"docs\": [\n \"All indices into `remaining_accounts`, flattened across all CPIs.\"\n ],\n \"type\": \"bytes\"\n },\n {\n \"name\": \"lengths\",\n \"docs\": [\n \"Number of accounts for each CPI call.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"CpiPlan\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"CpiPlanHeader\"\n }\n }\n },\n {\n \"name\": \"ref_count\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"refs\",\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"PackedInstructionRefHeader\"\n }\n },\n 10\n ]\n }\n },\n {\n \"name\": \"cpi_lengths\",\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n },\n {\n \"name\": \"cpi_types\",\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n },\n {\n \"name\": \"account_indices\",\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u8\",\n 1024\n ]\n },\n 4\n ]\n }\n },\n {\n \"name\": \"args\",\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u8\",\n 1024\n ]\n },\n 4\n ]\n }\n },\n {\n \"name\": \"tracked\",\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"CpiPlanAccount\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"packed\",\n \"type\": {\n \"defined\": {\n \"name\": \"CpiPlan\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CpiPlanHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unique_id\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"created_ts\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"CpiRefs\",\n \"docs\": [\n \"References for CPI invocations.\",\n \"\",\n \"This structure contains all the information needed to invoke CPIs\",\n \"from a pool of deduplicated accounts.\",\n \"\",\n \"# Fields\",\n \"\",\n \"- `accounts`: Mapping of account indices per CPI slot (first = program)\",\n \"- `types`: Index into `CPI_REGISTRY` for each CPI slot\",\n \"- `args`: Packed CPI args buffer (u16-length-prefixed per slot)\",\n \"\",\n \"# Convention\",\n \"\",\n \"The **first account** in each CPI slot's account list is the **program**.\",\n \"This is validated during invocation against the registry entry.\",\n \"\",\n \"# Example\",\n \"\",\n \"```text\",\n \"CpiRefs {\",\n \"accounts: CpiMapping {\",\n \"indices: [5, 0, 1, 2, 3, 4, 8, 6, 7, 0, 1],\",\n \"lengths: [6, 5],\",\n \"},\",\n \"types: [0, 2], // CPI 0 = PERENA_MINT, CPI 1 = JUPITER_SWAP\",\n \"args: [16, 0, ..16 bytes.., 0xFF, 0xFF],\",\n \"}\",\n \"```\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"accounts\",\n \"docs\": [\n \"Account indices per CPI (first account of each CPI = program).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"CpiMapping\"\n }\n }\n },\n {\n \"name\": \"types\",\n \"docs\": [\n \"Index into `CPI_REGISTRY` for each CPI slot.\"\n ],\n \"type\": \"bytes\"\n },\n {\n \"name\": \"args\",\n \"docs\": [\n \"Packed CPI args — `[u16 LE length][data]` per slot.\",\n \"0xFFFF = skip (program-provided), 0 = no-args, N = N bytes of client data.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"CreateCpiPlanParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unique_id\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"created_ts\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"refs\",\n \"type\": {\n \"vec\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CreateTokenLendingPositionParams\",\n \"docs\": [\n \"Parameters for initializing a new lending position on a Token.\",\n \"\",\n \"Account-backed values (`protocol_user_acc`, `collateral_reserve`,\",\n \"`debt_oracle`) are read from the `lp_position` composite on the `Accounts`\",\n \"struct rather than duplicated in this params struct.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lending_platform\",\n \"docs\": [\n \"Which lending protocol (e.g. Kamino, Marginfi)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPlatform\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debt_reserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"target_utilization_rate_bps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_above_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_below_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry trade increase is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"debt_mint\",\n \"docs\": [\n \"Debt asset configuration\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debt_decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"debt_token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"debt_oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"token_cpis\",\n \"docs\": [\n \"Optional setup CPIs (e.g. Kamino init_user_metadata, init_obligation,\",\n \"refresh_reserve, refresh_obligation) signed by the Token PDA and\",\n \"executed before the final refresh. When provided, the on-chain refresh\",\n \"reads the freshly-initialized protocol user account; otherwise the\",\n \"refresh is a no-op over an empty account.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CreateTokenParams\",\n \"docs\": [\n \"Parameters for creating a new yield token.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"interest_distribution\",\n \"type\": {\n \"defined\": {\n \"name\": \"InterestDistribution\"\n }\n }\n },\n {\n \"name\": \"oracle_config\",\n \"docs\": [\n \"Oracle configuration for pricing the collateral asset\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"OracleConfigDetails\"\n }\n }\n },\n {\n \"name\": \"fee_config\",\n \"docs\": [\n \"Fee configuration\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"FeeConfig\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CreateYieldingBankParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"oracle_config\",\n \"docs\": [\n \"Oracle configuration for pricing the base asset\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"OracleConfigDetails\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"DebtAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The mint of the borrowed asset (e.g. USDC)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Outstanding debt amount in the debt mint's native units\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvl_usd\",\n \"docs\": [\n \"USD value of the outstanding debt\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Oracle price of the debt asset (scaled to 10^decimals)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle account for the debt asset's price feed\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 1\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"DecreaseCarryPositionParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"target_utilization_rate_bps\",\n \"docs\": [\n \"Optional manager-only target utilization override used for post-repay\",\n \"validation.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"yb_ix_refs\",\n \"docs\": [\n \"Optional CPI refs for yielding-bank swap operations.\",\n \"When present, `source_asset_holding_index` must also be set.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"token_ix_refs\",\n \"docs\": [\n \"Pre-built repay CPI refs (must contain exactly one Repay CPI).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"docs\": [\n \"Index into the token's lending_positions array for the position to repay.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"repay_amount\",\n \"docs\": [\n \"Amount of debt tokens to repay. `AMOUNT_ALL_SENTINEL` repays the maximum\",\n \"available amount, capped by current debt. When set with `yb_ix_refs`, the\",\n \"swap only runs if the yielding bank TA is short of this amount and\",\n \"non-manager swap over-output is capped. When None, `yb_ix_refs` must be\",\n \"present and the maximum available repay amount is derived from the\",\n \"yielding bank TA balance change; swap over-output remains on the yielding\",\n \"bank.\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"source_asset_holding_index\",\n \"docs\": [\n \"Index of the source asset holding for the swap (0 = base_asset, 1-12 = assets[0-11]).\",\n \"Required when `yb_ix_refs` is present. Non-manager signers may only\",\n \"specify a holding whose mint matches the bank's `default_redemption_mint`.\"\n ],\n \"type\": {\n \"option\": \"u8\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"ExternalLiquidityType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"None\"\n },\n {\n \"name\": \"PerenaWithdrawalQueue\"\n }\n ]\n }\n },\n {\n \"name\": \"ExternalPositionConfig\",\n \"docs\": [\n \"Configuration for adding a new external yielding position.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lending_platform\",\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPlatform\"\n }\n }\n },\n {\n \"name\": \"lending_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"LendingType\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral_reserve\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debt_reserve\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocol_user_acc\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral\",\n \"type\": {\n \"defined\": {\n \"name\": \"AssetAllocationConfig\"\n }\n }\n },\n {\n \"name\": \"debt\",\n \"type\": {\n \"defined\": {\n \"name\": \"AssetAllocationConfig\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"ExternalYielding\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lending_platform\",\n \"docs\": [\n \"Which lending protocol this position is on (e.g. Marginfi, Kamino)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPlatform\"\n }\n }\n },\n {\n \"name\": \"lending_type\",\n \"docs\": [\n \"Whether this is a direct lending market deposit or a vault position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"LendingType\"\n }\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral_reserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debt_reserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocol_user_acc\",\n \"docs\": [\n \"The program's user/authority account on the lending protocol (e.g. marginfi account)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral\",\n \"docs\": [\n \"Collateral deposited into this external position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"AssetHoldingData\"\n }\n }\n },\n {\n \"name\": \"debt\",\n \"docs\": [\n \"Debt borrowed against the collateral (zero if lending-only, non-zero if leveraged)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"AssetHoldingData\"\n }\n }\n },\n {\n \"name\": \"tvl\",\n \"docs\": [\n \"Total value locked in this position (collateral value net of debt)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"time_created\",\n \"docs\": [\n \"Unix timestamp when this external yielding position slot was initialized.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 13\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"FeeConfig\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performance_fee_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"minting_fee_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"burning_fee_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"protocol_mint_burn_pct_bps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the protocol (vs. into the token price)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curator_mint_burn_pct_bps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the curator (vs. into the token price).\",\n \"`protocol_mint_burn_pct_bps + curator_mint_burn_pct_bps` must be <= 10000.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curator_perf_pct_bps\",\n \"docs\": [\n \"Curator's share of performance fees in basis points (rest goes to protocol).\",\n \"Must be <= 10000.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"fee_drip_max_apy_bps\",\n \"docs\": [\n \"Target and hard cap (bps) for annualized token-price growth during fee\",\n \"release. `0` parks absorbed fees.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"FeeDripState\",\n \"docs\": [\n \"Runtime state for the mint/burn fee \\\"drip\\\".\",\n \"\",\n \"When a mint or burn absorbs a holder fee (the residual after protocol and\",\n \"curator take their split), the fee is not applied to the token price\",\n \"immediately. The fee is physically extra collateral held in the reserve;\",\n \"it is parked here as `undripped_fee_collateral` and **subtracted from the\",\n \"price basis** (`price = (collateral − undripped_fee_collateral) / total_supply`)\",\n \"so the price stays flat at absorption time. `refresh_token` then releases the\",\n \"buffer gradually, which grows the price numerator and lifts the price smoothly\",\n \"rather than in a spike.\",\n \"\",\n \"Denominating the buffer in collateral (rather than phantom supply) keeps each\",\n \"absorbed fee a fixed nominal amount: it does not ride the token's appreciation\",\n \"while parked, and ongoing yield flows fully to holders during the drip window.\",\n \"\",\n \"A configurable APY target and hard cap\",\n \"(`TokenFees::fee_drip_max_apy_bps`) releases enough of the buffer on each\",\n \"refresh to bring annualized price growth up to the target without exceeding\",\n \"it. A zero target parks the buffer.\",\n \"`recollateralize_loss` may consume this buffer after exhausting any pending\",\n \"unwind residual, before the deficit reaches ordinary collateral backing.\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"undripped_fee_collateral\",\n \"docs\": [\n \"Collateral-denominated buffer of absorbed mint/burn holder fees not yet\",\n \"released into the price. Subtracted from the collateral in the price basis.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding0\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"apy_reference_price\",\n \"docs\": [\n \"Token price at the start of the current APY measurement window.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"apy_reference_ts\",\n \"docs\": [\n \"Timestamp at which `apy_reference_price` was recorded. The pair rolls\",\n \"only after the configured APY measurement window has elapsed.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 3\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"IncreaseCarryPositionParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"ix_refs\",\n \"docs\": [\n \"Pre-built borrow CPI refs (must contain exactly one Borrow CPI).\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"docs\": [\n \"Index into the token's lending_positions array for the position to borrow against.\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"InstructionRefs\",\n \"docs\": [\n \"Top-level references for an instruction.\",\n \"\",\n \"Bundles CPI refs (accounts, types, args) with tracked account indices.\",\n \"Passed as an instruction argument from TypeScript.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cpi\",\n \"docs\": [\n \"CPI account mapping, type indices, and packed args.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"CpiRefs\"\n }\n }\n },\n {\n \"name\": \"tracked\",\n \"docs\": [\n \"Indices into `remaining_accounts` for direct access.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"InterestDistribution\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"IntoTokenPrice\"\n },\n {\n \"name\": \"IntoWallets\"\n }\n ]\n }\n },\n {\n \"name\": \"LendingPlatform\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"None\"\n },\n {\n \"name\": \"Marginfi\"\n },\n {\n \"name\": \"Kamino\"\n }\n ]\n }\n },\n {\n \"name\": \"LendingPosition\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"platform\",\n \"docs\": [\n \"Which lending protocol this position is on (e.g. Marginfi, Kamino)\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPlatform\"\n }\n }\n },\n {\n \"name\": \"withdraw_pending\",\n \"docs\": [\n \"This is a flag if we should allow this position's utilization rate to fall below target\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PodBool\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPositionAccounting\"\n }\n }\n },\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"LendingPositionConfig\"\n }\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"The lending protocol's pool/group account\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"collateral_reserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the collateral asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"debt_reserve\",\n \"docs\": [\n \"The lending protocol's reserve/bank for the debt asset\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"protocol_user_acc\",\n \"docs\": [\n \"The program's user/authority account on the lending protocol\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"last_updated_ts\",\n \"docs\": [\n \"Unix timestamp of the last `rebalance_token` executed against this\",\n \"position. Enforces the `REBALANCE_TOKEN_RATE_LIMIT_SECS` cooldown so a\",\n \"single position cannot be rebalanced (and pay the swap spread) more than\",\n \"once per rate-limit window. Zero until the first rebalance.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 23\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LendingPositionAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"collateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"debt\",\n \"type\": {\n \"defined\": {\n \"name\": \"DebtAccounting\"\n }\n }\n },\n {\n \"name\": \"ltv_utilization_rate_bps\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LendingPositionConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"target_utilization_rate_bps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_above_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_below_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry position increase is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 3\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LendingType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"LendingMarket\"\n },\n {\n \"name\": \"Vault\"\n }\n ]\n }\n },\n {\n \"name\": \"LpRefIndices\",\n \"docs\": [\n \"Index-based account references for the token refresh.\",\n \"\",\n \"All indices point into the shared `remaining_accounts` pool, which is also\",\n \"used by `prerequisite_cpis`. Accounts are deduplicated across both: a single\",\n \"oracle or reserve referenced by multiple positions (or by a prereq CPI and a\",\n \"position) appears once in `remaining_accounts` and is referenced by index.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"user_account\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collateral_reserve\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"debt_oracle\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"OracleConfigDetails\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"oracle_type\",\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n },\n {\n \"name\": \"secondary_oracle\",\n \"docs\": [\n \"Optional secondary oracle account for composite oracle types (e.g. the\",\n \"SPL stake pool account for `PythSplStake`). `None` for single-account\",\n \"oracle types.\"\n ],\n \"type\": {\n \"option\": \"pubkey\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"OracleType\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Pyth\"\n },\n {\n \"name\": \"Switchboard\"\n },\n {\n \"name\": \"PerenaBank\"\n },\n {\n \"name\": \"PerenaTranche\"\n },\n {\n \"name\": \"PythSplStake\"\n },\n {\n \"name\": \"TPConsensusOracle\"\n }\n ]\n }\n },\n {\n \"name\": \"PackedInstructionRefHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cpi_start\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"cpi_count\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"account_indices_start\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"account_indices_len\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"args_start\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"args_len\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"tracked_start\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"tracked_len\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"PodBool\",\n \"repr\": {\n \"kind\": \"transparent\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n \"u8\"\n ]\n }\n },\n {\n \"name\": \"RebalanceTokenParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lp_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"flash_fee_amount\",\n \"docs\": [\n \"Flash-loan fee in source-debt base units. The handler derives the\",\n \"total flash-repay amount from this plus the source-debt ATA balance\",\n \"observed at handler entry (= what Kamino actually flash-borrowed\",\n \"into the ATA), so the post-swap balance check, dust sweep, and\",\n \"SPL-Approve delegation always use the on-chain reality even if the\",\n \"off-chain builder's borrow size drifts.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"repay_amount\",\n \"docs\": [\n \"Source LP repay = flash-borrow principal. The handler injects this\",\n \"into the repay CPI loaded from the CPI plan.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"destination_debt_oracle_type\",\n \"docs\": [\n \"Oracle type for the destination debt mint. Used to update the lending\",\n \"position's stored oracle_type when swapping debt in place, so that the\",\n \"post-borrow refresh reads the new oracle price correctly.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"OracleType\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"RecollateralizeLossParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh\",\n \"(e.g. Kamino refresh_reserve, refresh_obligation).\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"ix_refs\",\n \"docs\": [\n \"CPI refs for the Withdraw -> Swap -> Repay sequence (exactly 1 of each,\",\n \"in that order). All three CPIs share one deduplicated account pool.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"docs\": [\n \"Index into the token's lending_positions array.\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"RedemptionEpoch\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"header\",\n \"type\": {\n \"defined\": {\n \"name\": \"RedemptionEpochHeader\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"RedemptionEpochAccounting\"\n }\n }\n },\n {\n \"name\": \"processing\",\n \"type\": {\n \"defined\": {\n \"name\": \"RedemptionEpochProcessing\"\n }\n }\n },\n {\n \"name\": \"sequencing\",\n \"type\": {\n \"defined\": {\n \"name\": \"RedemptionEpochSequencing\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"RedemptionEpochAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"gross_collateral_claim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"requested_y_token_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"realized_unwind_loss\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funded_collateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"RedemptionEpochHeader\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"id\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"created_ts\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"closed_ts\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"SOL rent payer for this epoch PDA's allocation (first async burn).\",\n \"Lamports from closing this account must return here (Pubkey::default =\",\n \"legacy epochs → refund may fall back to manager on-chain).\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"RedemptionEpochProcessing\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"processed_collateral\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processed_unwind_loss\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processed_y_token_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processed_gross_collateral_claim\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"RedemptionEpochSequencing\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"request_count\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"processed_request_count\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_request_sequence\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_request_sequence_to_process\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"RefreshTokenStateParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"docs\": [\n \"Optional prerequisite CPIs executed before any lending-position refresh.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n }\n },\n {\n \"name\": \"account_refs\",\n \"docs\": [\n \"Index-based account references into the shared `remaining_accounts` pool.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"TokenRefreshRefs\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"SetRedemptionEpochStatusParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"Token\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenConfig\"\n }\n }\n },\n {\n \"name\": \"collateral\",\n \"type\": {\n \"defined\": {\n \"name\": \"CollateralConfig\"\n }\n }\n },\n {\n \"name\": \"fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenFees\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenAccounting\"\n }\n }\n },\n {\n \"name\": \"debt_carry\",\n \"docs\": [\n \"The carry positions — borrows debt against collateral deposited in lending positions,\",\n \"then converts proceeds into yielding banks to earn the yield spread\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"YieldingCarryPosition\"\n }\n },\n 3\n ]\n }\n },\n {\n \"name\": \"_padding0\",\n \"type\": {\n \"array\": [\n \"u64\",\n 19\n ]\n }\n },\n {\n \"name\": \"lending_positions\",\n \"docs\": [\n \"Lending positions across supported platforms (e.g. Marginfi, Kamino) where collateral is deployed\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"LendingPosition\"\n }\n },\n 6\n ]\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 128\n ]\n }\n },\n {\n \"name\": \"roles\",\n \"docs\": [\n \"Per-token authorization roles. Unset fields fall back to program-level defaults.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"TokenRoles\"\n }\n }\n },\n {\n \"name\": \"fee_drip\",\n \"docs\": [\n \"Mint/burn fee-drip buffer and APY reference. Appended after `roles`\",\n \"(consuming reserved padding) so all preceding field offsets stay stable\",\n \"for already-deployed accounts.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"FeeDripState\"\n }\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 164\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"TokenAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"price\",\n \"docs\": [\n \"Price here is denominated in the collateral mint price\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_supply\",\n \"docs\": [\n \"Total number of tokens in circulating supply (includes pending protocol fees)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvl_usd\",\n \"docs\": [\n \"Total TVL of a token. All collateral + YBA carry positions - debt\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"last_refreshed_ts\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"first_mint_ts\",\n \"docs\": [\n \"First successful mint timestamp. Remains 0 until first mint.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_protocol_fees\",\n \"docs\": [\n \"Protocol fees accrued but not yet minted (collected via `collect_fees`\",\n \"by `PROTOCOL_ADMIN`).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_curator_fees\",\n \"docs\": [\n \"Curator fees accrued but not yet minted (collected via `collect_fees`\",\n \"by the token's curator).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_async_redemption_liability\",\n \"docs\": [\n \"Collateral claim from async redemption requests that has not yet been\",\n \"settled. This is tracked separately so redemption-specific unwind losses\",\n \"can reduce the liability instead of active-holder NAV.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_async_burn_amount\",\n \"docs\": [\n \"yTokens currently escrowed in async burn requests and awaiting FIFO\",\n \"fulfillment.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_async_fee_retained\",\n \"docs\": [\n \"Protocol + curator fee tokens within `pending_async_burn_amount` that\",\n \"will be retained in `total_supply` as pending fees when the burn is\",\n \"processed.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"pending_unwind_residual\",\n \"docs\": [\n \"Collateral retained from async burners as their share of epoch unwind\",\n \"losses (`loss_for_request` in `process_async_burn`). Physically part of\",\n \"the collateral balance (and of `unlent_amount`), but earmarked to cover\",\n \"the carry−debt deficit the epoch unwind left behind. The price formula\",\n \"excludes `min(residual, hidden deficit)` from the price basis so the\",\n \"residual doesn't inflate the price while the deficit it funds is still\",\n \"clamped out of it; `recollateralize_loss` consumes it before undripped\",\n \"fees and ordinary collateral backing as the deficit is closed.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"id\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"The token's mint address\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"decimals\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_program\",\n \"type\": {\n \"defined\": {\n \"name\": \"TokenProgram\"\n }\n }\n },\n {\n \"name\": \"interest_distribution\",\n \"docs\": [\n \"Determines how accrued interest is distributed — either folded into\",\n \"the token price (rebase) or sent directly to holder wallets\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"InterestDistribution\"\n }\n }\n },\n {\n \"name\": \"circuit_breaker\",\n \"docs\": [\n \"When active, halts all activity except decrease_carry_position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PodBool\"\n }\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"_padding3\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"burn_rate_limit\",\n \"docs\": [\n \"Rolling rate limit on burn (redemption) volume per time window.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"AmountRateLimit\"\n }\n }\n },\n {\n \"name\": \"deposit_limit\",\n \"docs\": [\n \"Maximum total collateral backing the token, in raw collateral base units.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding4\",\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"TokenFees\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performance_fee_bps\",\n \"docs\": [\n \"The protocol fee to take against the yield that has been earned.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"minting_fee_bps\",\n \"docs\": [\n \"The fee to take when minting new tokens. Split between protocol, curator,\",\n \"and token price per the `*_mint_burn_pct_bps` fields below.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"burning_fee_bps\",\n \"docs\": [\n \"The fee to take when burning tokens. Split between protocol, curator,\",\n \"and token price per the `*_mint_burn_pct_bps` fields below.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"protocol_mint_burn_pct_bps\",\n \"docs\": [\n \"Protocol's share of mint/burn fees (in bps of `total_fee`).\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curator_mint_burn_pct_bps\",\n \"docs\": [\n \"Curator's share of mint/burn fees (in bps of `total_fee`).\",\n \"`protocol_mint_burn_pct_bps + curator_mint_burn_pct_bps <= 10_000`; the\",\n \"remainder (if any) stays in the token price.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"curator_perf_pct_bps\",\n \"docs\": [\n \"Curator's share of performance fees (in bps of `total_perf_fee`).\",\n \"The protocol implicitly receives `10_000 - curator_perf_pct_bps`.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"fee_drip_max_apy_bps\",\n \"docs\": [\n \"Target and hard cap (in bps) for annualized token-price growth during fee\",\n \"release. Refreshes release enough buffered collateral to approach this\",\n \"target without exceeding it. Natural yield can exceed the target and\",\n \"cannot be clawed back. `0` parks the buffer.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"TokenProgram\",\n \"repr\": {\n \"kind\": \"rust\"\n },\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Spl\"\n },\n {\n \"name\": \"Token2022\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenRefreshRefs\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lending_positions\",\n \"docs\": [\n \"Per active lending position (in active-slot order, skipping inactive slots).\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": {\n \"name\": \"LpRefIndices\"\n }\n }\n }\n },\n {\n \"name\": \"carry_positions\",\n \"docs\": [\n \"Per active carry position (in active-slot order, skipping zero-share slots):\",\n \"index of the `YieldingBank` account in `remaining_accounts`.\"\n ],\n \"type\": \"bytes\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenRoles\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"_padding0\",\n \"docs\": [\n \"Reserved space that keeps the role fields at their existing offsets\",\n \"after reducing the token's lending-position capacity.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"curator\",\n \"docs\": [\n \"The whitelisted curator that created this token. Treated as the \\\"creator\\\"\",\n \"and used for cross-state curator-match checks (e.g. increase_carry_position\",\n \"requires token.curator == yielding_bank.curator). Rotatable by the token\",\n \"admin to another `WHITELISTED_CURATORS` entry via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Authority for token-level config updates, metadata changes, fee edits, and\",\n \"circuit-breaker deactivation. Intended to be a multisig in production.\",\n \"Rotatable by the current admin via `update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Ops wallet authorized to run manager-gated instructions (increase_carry_position,\",\n \"collect_interest, rebalance, deposit_unlent_collateral, claim_incentives, etc).\",\n \"Rotatable via `update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fees\",\n \"docs\": [\n \"Curator's fee wallet — receives the curator's share of mint/burn fees and\",\n \"performance fees. Rotatable by the token admin or the token curator via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cb_controller\",\n \"docs\": [\n \"Emergency-halt wallet authorized to *activate* the circuit breaker.\",\n \"Deactivation remains admin-only and time-gated. Rotatable via\",\n \"`update_token_configuration`.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"TopUpUnlentReservesParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"prerequisite_cpis\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"ix_refs\",\n \"type\": {\n \"defined\": {\n \"name\": \"InstructionRefs\"\n }\n }\n },\n {\n \"name\": \"lending_position_index\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"UpdateLendingPositionConfigParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lending_position_index\",\n \"docs\": [\n \"Index into the token's lending_positions array\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"target_utilization_rate_bps\",\n \"docs\": [\n \"Target LTV utilization rate in basis points (relative to max LTV)\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_above_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can exceed target before permissionless unwind is allowed\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_deviation_below_target_util_bps\",\n \"docs\": [\n \"Max bps the utilization rate can fall below target before carry trade increase is allowed\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"UpdateTokenConfigurationParams\",\n \"docs\": [\n \"Parameters for updating a token's mutable configuration.\",\n \"\",\n \"Every field is optional: `None` means \\\"no change\\\". Oracle configuration is\",\n \"immutable after creation — use `create_token` to set the oracle, and deploy a\",\n \"new token if it needs to change.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"performance_fee_bps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"minting_fee_bps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"burning_fee_bps\",\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"protocol_mint_burn_pct_bps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the protocol (in bps)\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"curator_mint_burn_pct_bps\",\n \"docs\": [\n \"Percentage of mint/burn fees that go to the curator (in bps)\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"curator_perf_pct_bps\",\n \"docs\": [\n \"Curator's share of performance fees (in bps); protocol implicitly gets the rest.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"fee_drip_max_apy_bps\",\n \"docs\": [\n \"Target and hard cap (bps) for annualized price growth during fee release.\",\n \"`Some(0)` parks absorbed fees.\"\n ],\n \"type\": {\n \"option\": \"u16\"\n }\n },\n {\n \"name\": \"burn_rate_limit\",\n \"docs\": [\n \"Optional burn-rate-limit config update; omitted leaves the current config unchanged.\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"BurnRateLimitUpdateParams\"\n }\n }\n }\n },\n {\n \"name\": \"deposit_limit\",\n \"docs\": [\n \"Optional cap on total collateral backing (unlent + lent), in raw collateral base units.\",\n \"`None` leaves unchanged. `Some(0)` disables the cap (same semantics as `mint_token`).\",\n \"For `Some(limit)` with `limit > 0`, `limit` must be ≥ that total or the instruction errors.\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"UpdateYieldingBankConfigParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": []\n }\n },\n {\n \"name\": \"YieldingAccounting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"total_shares\",\n \"docs\": [\n \"Total shares outstanding across all token carry positions allocated to this bank,\",\n \"stored in raw share units scaled by the yielding bank `config.decimals`\",\n \"(canonically 8 share decimals).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"share_price\",\n \"docs\": [\n \"Price per whole UI share, stored in the shared 8-decimal USD base unit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"last_refreshed_ts\",\n \"docs\": [\n \"Timestamp of the last share price refresh\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvl\",\n \"docs\": [\n \"Total TVL across all YBA holdings and external lending positions,\",\n \"normalized to the shared 8-decimal USD base unit ($1 = 100_000_000).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"last_rebalanced_ts\",\n \"docs\": [\n \"Timestamp of the last time the yielding bank has been rebalanced\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 19\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"YieldingBank\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": {\n \"defined\": {\n \"name\": \"YieldingConfig\"\n }\n }\n },\n {\n \"name\": \"accounting\",\n \"type\": {\n \"defined\": {\n \"name\": \"YieldingAccounting\"\n }\n }\n },\n {\n \"name\": \"base_asset\",\n \"docs\": [\n \"The base mint asset holding — always present, never cleared by cleanup.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"AssetHolding\"\n }\n }\n },\n {\n \"name\": \"assets\",\n \"docs\": [\n \"Additional asset holdings beyond the base mint.\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"AssetHolding\"\n }\n },\n 12\n ]\n }\n },\n {\n \"name\": \"external_yielding_positions\",\n \"docs\": [\n \"Positions in external lending/vault protocols that actively generate yield\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"ExternalYielding\"\n }\n },\n 6\n ]\n }\n },\n {\n \"name\": \"roles\",\n \"docs\": [\n \"Per-yielding-bank authorization roles. Unset fields fall back to program-level defaults.\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"YieldingBankRoles\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 144\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"YieldingBankAllocationConfig\",\n \"docs\": [\n \"Argument on `rebalance_yielding_bank` to register one new holding or\",\n \"external position that the rebalance will fund. At most one of the two\",\n \"fields may be `Some` per call.\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"asset_holding\",\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"AssetConfig\"\n }\n }\n }\n },\n {\n \"name\": \"external_position\",\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"ExternalPositionConfig\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"YieldingBankRoles\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"curator\",\n \"docs\": [\n \"The whitelisted curator that created this yielding bank. Must match the\",\n \"token's curator when attaching a carry position via `increase_carry_position`.\",\n \"Rotatable by the bank admin to another `WHITELISTED_CURATORS` entry via\",\n \"`update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"Authority for yielding-bank config updates and circuit-breaker deactivation.\",\n \"Intended to be a multisig in production. Rotatable by the current admin via\",\n \"`update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"manager\",\n \"docs\": [\n \"Ops wallet authorized to run manager-gated instructions on this bank\",\n \"(rebalance_yielding_bank, create_yielding_bank_allocation). Rotatable\",\n \"via `update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cb_controller\",\n \"docs\": [\n \"Emergency-halt wallet authorized to activate the circuit breaker. Deactivation\",\n \"remains admin-only and time-gated. Rotatable via `update_yielding_bank_config`.\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"YieldingCarryPosition\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"yielding_base_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"yielding_bank_id\",\n \"docs\": [\n \"Identifier for the yield-bearing asset bank this carry position is allocated to\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"shares\",\n \"docs\": [\n \"Number of shares held in the yielding bank (converts to underlying via bank share price)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tvl_usd\",\n \"docs\": [\n \"Raw USD value of this token's share of the yielding bank, normalized to\",\n \"8-decimal USD ($1 = 100_000_000).\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding3\",\n \"type\": {\n \"array\": [\n \"u64\",\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"YieldingConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"bump\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"id\",\n \"docs\": [\n \"Unique identifier for this bank, used in PDA derivation and referenced by token carry positions\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"decimals\",\n \"docs\": [\n \"Share precision for `total_shares` accounting and share-price math.\",\n \"Canonically 8 so one whole UI share is priced in the shared TVL USD base unit.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"circuit_breaker\",\n \"docs\": [\n \"When active, halts all activity except decrease_carry_position\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PodBool\"\n }\n }\n },\n {\n \"name\": \"_padding1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"default_redemption_mint\",\n \"docs\": [\n \"The mint that should be used as the default source when redeeming\",\n \"(e.g. swapping from this mint into a debt mint during decrease_carry_position).\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"time_created_ts\",\n \"docs\": [\n \"Unix timestamp when this yielding bank was created.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"_padding2\",\n \"type\": {\n \"array\": [\n \"u64\",\n 18\n ]\n }\n }\n ]\n }\n }\n ]\n} as unknown as LongYieldCarry;\n"],"mappings":"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QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;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","names":["import_kit","import_web3","import_kit","import_web3","address","address","import_web3","import_kit","import_token","buf","import_kit","import_token","import_kit","import_web3","address","import_token","import_kit","import_kit","import_kit","import_core","import_web3","import_kit","import_kit","import_system","address","addressEncoder","import_system","bs58","import_kit","import_kit","import_kit","import_core","import_token","import_token_2022","import_system","import_kit","import_system","import_sysvars","import_core","address","import_web3","import_core","import_kit","address","oracle","import_kit","addressEncoder","import_web3","import_address_lookup_table","import_compute_budget","import_system","import_token","import_token_2022","import_kit","import_kit","mints","mints","import_kit","import_ts_retry","import_kit","import_core","import_web3","import_token","import_system","oracle","mints","prices","mints","address","oracle","mints","oracle","mints","import_core","import_token","import_core","import_system","import_token","import_core"]}
|