@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../shared/common/src/constants/general.ts","../../../shared/common/src/utils/transaction.ts","../../../shared/common/src/utils/instruction.ts","../../../shared/common/src/services/baseAccountClient.ts","../../../shared/common/src/services/dataCache.ts","../../../shared/common/src/utils/solana.ts","../../../shared/common/src/utils/general.ts","../../../shared/common/src/utils/accounts/pda.ts","../../../shared/common/src/utils/compat.ts","../../../shared/common/src/utils/accounts/rpc.ts","../../../shared/common/src/services/mints/registry.ts","../../../shared/common/src/services/mints/defaults.ts","../../../shared/common/src/utils/numbers.ts","../../../shared/common/src/services/mints/symbols.ts","../../../shared/common/src/services/lutManager.ts","../../../shared/common/src/utils/accounts/roles.ts","../../../shared/common/src/utils/accounts/meta.ts","../../../shared/common/src/utils/accounts/splBalances.ts","../../../shared/common/src/utils/data.ts","../../../shared/common/src/utils/cpi/args.ts","../../../shared/common/src/utils/cpi/refs.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/transactionSplitter.ts","../../../shared/common/src/utils/jito.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/constants/generated/cpi.ts","../../../shared/common/src/utils/priorityFee.ts","../../../shared/common/src/constants/accountMetas.ts","../../../shared/common/src/services/baseIxBuilderService.ts","../../../shared/common/src/services/swap/swapRouting.ts","../../../shared/oracle-service/src/constants/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/perena-helpers/src/utils.ts","../../../shared/oracle-service/src/oracle.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/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"],"sourcesContent":["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 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 { 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 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","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 { 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\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 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 type { MintIdentifier } from \"../../types\";\nimport type { MintRegistry } from \"./registry\";\nimport { mints } from \"./registry\";\n\n/** Human-readable token symbol from the registry, or a short address prefix when unknown. */\nexport function mintSymbol(mint: MintIdentifier, registry: MintRegistry = mints): string {\n return registry.get(mint)?.symbol ?? String(mint).slice(0, 6);\n}\n\n/** Pair label for two mints, e.g. `cbBTC/PYUSD`. */\nexport function formatMintPair(\n leftMint: MintIdentifier,\n rightMint: MintIdentifier,\n registry: MintRegistry = mints\n): string {\n return `${mintSymbol(leftMint, registry)}/${mintSymbol(rightMint, registry)}`;\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 { 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\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 { TransactionCacheInvalidation } from \"../types/general\";\nimport { SPL_ATA_CACHE_CATEGORY } from \"../services/baseAccountClient\";\nimport type { DataCache } from \"../services/dataCache\";\n\nexport interface ApplyDataCacheTransactionInvalidationsOptions {\n /**\n * `DataCache` category used for `lycToken` invalidations (program-specific; e.g. LYC uses `\"token\"`).\n */\n tokenPdaCategory: string;\n /**\n * `DataCache` category used for `lycYieldingBank` invalidations.\n */\n yieldingBankPdaCategory: string;\n}\n\n/**\n * Clears {@link DataCache} entries described by post-success invalidations.\n *\n * Handles `lycToken`, `lycYieldingBank`, `splAta`, and `perena` branches of\n * {@link TransactionCacheInvalidation}. Ignores `kamino` entries (those are\n * applied by lending-platform clients).\n */\nexport function applyDataCacheTransactionInvalidations(\n dataCache: DataCache,\n invalidations: TransactionCacheInvalidation[],\n options: ApplyDataCacheTransactionInvalidationsOptions\n): void {\n for (const inv of invalidations) {\n if (inv.client === \"lycToken\") {\n dataCache.clearCacheEntry(options.tokenPdaCategory, inv.tokenPda);\n } else if (inv.client === \"lycYieldingBank\") {\n dataCache.clearCacheEntry(options.yieldingBankPdaCategory, inv.yieldingBankPda);\n } else if (inv.client === \"splAta\") {\n dataCache.clearCacheEntry(SPL_ATA_CACHE_CATEGORY, inv.ata);\n } else if (inv.client === \"perena\") {\n inv.dataCache.clearCacheEntry(inv.category, inv.id);\n }\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 {\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","/**\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 * 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","/**\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","// 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","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","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","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 type { Address } from \"@solana/kit\";\nimport type { RoutableSwapClient } from \"./routableSwapClient\";\n\n/**\n * Whether a routable swap client can quote a swap from `inputMint` to `outputMint`.\n *\n * - **Wildcard** (`inputMints` and `outputMints` both empty): any distinct pair\n * (Jupiter-style fallback).\n * - Otherwise: `inputMint` must be in `inputMints` and `outputMint` in `outputMints`.\n * When `routeAnchorMints` is non-empty, at least one of the two mints must be an\n * anchor — see {@link RoutableSwapClient} (two name sets alone are not enough for\n * protocols like Perena).\n */\nexport function swapClientCanRoute(\n client: RoutableSwapClient,\n inputMint: Address,\n outputMint: Address\n): boolean {\n if (inputMint === outputMint) {\n return false;\n }\n\n if (client.inputMints.length === 0 && client.outputMints.length === 0) {\n return true;\n }\n\n if (!client.inputMints.includes(inputMint) || !client.outputMints.includes(outputMint)) {\n return false;\n }\n\n if (client.routeAnchorMints.length === 0) {\n return true;\n }\n\n return client.routeAnchorMints.some((m) => m === inputMint || m === outputMint);\n}\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 { 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 type { Address } from \"@solana/kit\";\nimport {\n CpiTypes,\n DEFAULT_PUBLIC_KEY,\n dedupeOrderedAddresses,\n filterSpecificAccounts,\n getAtaAddress,\n mints,\n wholeTokenAmount,\n type CpiData,\n} from \"common\";\nimport { PerenaClient } from \"./client\";\n\n/**\n * Extract Perena withdrawal queue accounts referenced by request/fulfill-unstake\n * CPI data.\n */\nexport function getPerenaWithdrawalQueueAddressesFromCpiData(\n cpiData: readonly CpiData[]\n): Address[] {\n return cpiData\n .filter(\n (cpi) =>\n cpi.cpiType === CpiTypes.PERENA_REQUEST_UNSTAKE ||\n cpi.cpiType === CpiTypes.PERENA_FULFILL_UNSTAKE\n )\n .map((cpi) => cpi.accounts[2]?.address)\n .filter((address): address is Address => address !== undefined);\n}\n\nexport async function getGeneralLookupTableAccountsForPerena(\n perenaClient: PerenaClient\n): Promise<Address[]> {\n const bankMintInfo = mints.get(\"USD*\");\n const juniorMintInfo = mints.get(\"USD*-J\");\n const usdcMintInfo = mints.get(\"USDC\");\n if (!bankMintInfo || !juniorMintInfo || !usdcMintInfo) {\n throw new Error(\"USD*, USD*-J, and USDC must exist in the mint registry\");\n }\n\n const dummyUser = DEFAULT_PUBLIC_KEY;\n const bankMintUserAta = await getAtaAddress(\n bankMintInfo.address,\n dummyUser,\n bankMintInfo.tokenProgram\n );\n const juniorMintUserAta = await getAtaAddress(\n juniorMintInfo.address,\n dummyUser,\n juniorMintInfo.tokenProgram\n );\n const usdcMintUserAta = await getAtaAddress(\n usdcMintInfo.address,\n dummyUser,\n usdcMintInfo.tokenProgram\n );\n\n const allAccounts: Address[] = [];\n\n const stakeQuote = await perenaClient.getQuote({\n inputMint: bankMintInfo.address,\n outputMint: juniorMintInfo.address,\n amount: wholeTokenAmount(bankMintInfo.decimals),\n slippageBps: 50,\n });\n const stakeCpi = await perenaClient.getSwapCpiData(stakeQuote, dummyUser);\n allAccounts.push(\n ...filterSpecificAccounts(\n stakeCpi.accounts.map((account) => account.address),\n [DEFAULT_PUBLIC_KEY, bankMintUserAta, juniorMintUserAta]\n )\n );\n\n const mintQuote = await perenaClient.getQuote({\n inputMint: usdcMintInfo.address,\n outputMint: bankMintInfo.address,\n amount: wholeTokenAmount(usdcMintInfo.decimals),\n slippageBps: 50,\n });\n const mintCpi = await perenaClient.getSwapCpiData(mintQuote, dummyUser);\n allAccounts.push(\n ...filterSpecificAccounts(\n mintCpi.accounts.map((account) => account.address),\n [DEFAULT_PUBLIC_KEY, usdcMintUserAta, bankMintUserAta]\n )\n );\n\n const burnQuote = await perenaClient.getQuote({\n inputMint: bankMintInfo.address,\n outputMint: usdcMintInfo.address,\n amount: wholeTokenAmount(bankMintInfo.decimals),\n slippageBps: 50,\n });\n const burnCpi = await perenaClient.getSwapCpiData(burnQuote, dummyUser);\n allAccounts.push(\n ...filterSpecificAccounts(\n burnCpi.accounts.map((account) => account.address),\n [DEFAULT_PUBLIC_KEY, bankMintUserAta, usdcMintUserAta]\n )\n );\n\n return dedupeOrderedAddresses(allAccounts);\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 { 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 } 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"],"mappings":"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","names":["compileTransaction","getBase64EncodedWireTransaction","fetchMaybeToken","TOKEN_PROGRAM_ADDRESS","address","address","PublicKey","address","PublicKey","address","TOKEN_PROGRAM_ADDRESS","address","TOKEN_PROGRAM_ADDRESS","TOKEN_PROGRAM_ADDRESS","fetchMaybeToken","getProgramDerivedAddress","getAddressEncoder","AccountRole","address","buf","upgradeRoleToSigner","upgradeRoleToWritable","upgradeRoleToWritable","upgradeRoleToSigner","Keypair","Keypair","getTransferSolInstruction","getTransferSolInstruction","sum","compileTransaction","address","BN","TOKEN_PROGRAM_ADDRESS","TOKEN_2022_PROGRAM_ADDRESS","TOKEN_PROGRAM_ADDRESS","TOKEN_2022_PROGRAM_ADDRESS","TOKEN_PROGRAM_ADDRESS","AccountRole","SYSVAR_RENT_ADDRESS","SYSTEM_PROGRAM_ADDRESS","SYSVAR_RENT_ADDRESS","SYSTEM_PROGRAM_ADDRESS","address","addressEncoder","getAddressEncoder","getProgramDerivedAddress","getBase64EncodedWireTransaction","compileTransaction","address","address","BN","PublicKey","ASSOCIATED_TOKEN_PROGRAM_ADDRESS","SYSTEM_PROGRAM_ADDRESS","PublicKey","BN","SYSTEM_PROGRAM_ADDRESS","ASSOCIATED_TOKEN_PROGRAM_ADDRESS","address","address","mints","mints","address","retry","oracle","mints","retry","prices","mints","address","oracle","mints","oracle","address","mints"]}
|