@kamino-finance/klend-sdk 2.10.6
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 +85 -0
- package/dist/classes/action.d.ts +154 -0
- package/dist/classes/action.js +1505 -0
- package/dist/classes/action.js.map +1 -0
- package/dist/classes/curve.d.ts +15 -0
- package/dist/classes/curve.js +32 -0
- package/dist/classes/curve.js.map +1 -0
- package/dist/classes/fraction.d.ts +23 -0
- package/dist/classes/fraction.js +60 -0
- package/dist/classes/fraction.js.map +1 -0
- package/dist/classes/index.d.ts +8 -0
- package/dist/classes/index.js +25 -0
- package/dist/classes/index.js.map +1 -0
- package/dist/classes/jupiterPerps.d.ts +2 -0
- package/dist/classes/jupiterPerps.js +25 -0
- package/dist/classes/jupiterPerps.js.map +1 -0
- package/dist/classes/market.d.ts +140 -0
- package/dist/classes/market.js +901 -0
- package/dist/classes/market.js.map +1 -0
- package/dist/classes/obligation.d.ts +170 -0
- package/dist/classes/obligation.js +610 -0
- package/dist/classes/obligation.js.map +1 -0
- package/dist/classes/reserve.d.ts +161 -0
- package/dist/classes/reserve.js +474 -0
- package/dist/classes/reserve.js.map +1 -0
- package/dist/classes/shared.d.ts +41 -0
- package/dist/classes/shared.js +10 -0
- package/dist/classes/shared.js.map +1 -0
- package/dist/classes/utils.d.ts +40 -0
- package/dist/classes/utils.js +129 -0
- package/dist/classes/utils.js.map +1 -0
- package/dist/idl.json +4102 -0
- package/dist/idl_codegen/accounts/LendingMarket.d.ts +153 -0
- package/dist/idl_codegen/accounts/LendingMarket.js +204 -0
- package/dist/idl_codegen/accounts/LendingMarket.js.map +1 -0
- package/dist/idl_codegen/accounts/Obligation.d.ts +139 -0
- package/dist/idl_codegen/accounts/Obligation.js +193 -0
- package/dist/idl_codegen/accounts/Obligation.js.map +1 -0
- package/dist/idl_codegen/accounts/ReferrerState.d.ts +22 -0
- package/dist/idl_codegen/accounts/ReferrerState.js +101 -0
- package/dist/idl_codegen/accounts/ReferrerState.js.map +1 -0
- package/dist/idl_codegen/accounts/ReferrerTokenState.d.ts +51 -0
- package/dist/idl_codegen/accounts/ReferrerTokenState.js +126 -0
- package/dist/idl_codegen/accounts/ReferrerTokenState.js.map +1 -0
- package/dist/idl_codegen/accounts/Reserve.d.ts +72 -0
- package/dist/idl_codegen/accounts/Reserve.js +156 -0
- package/dist/idl_codegen/accounts/Reserve.js.map +1 -0
- package/dist/idl_codegen/accounts/ShortUrl.d.ts +22 -0
- package/dist/idl_codegen/accounts/ShortUrl.js +101 -0
- package/dist/idl_codegen/accounts/ShortUrl.js.map +1 -0
- package/dist/idl_codegen/accounts/UserMetadata.d.ts +48 -0
- package/dist/idl_codegen/accounts/UserMetadata.js +126 -0
- package/dist/idl_codegen/accounts/UserMetadata.js.map +1 -0
- package/dist/idl_codegen/accounts/UserState.d.ts +143 -0
- package/dist/idl_codegen/accounts/UserState.js +180 -0
- package/dist/idl_codegen/accounts/UserState.js.map +1 -0
- package/dist/idl_codegen/accounts/index.d.ts +16 -0
- package/dist/idl_codegen/accounts/index.js +20 -0
- package/dist/idl_codegen/accounts/index.js.map +1 -0
- package/dist/idl_codegen/errors/anchor.d.ts +434 -0
- package/dist/idl_codegen/errors/anchor.js +713 -0
- package/dist/idl_codegen/errors/anchor.js.map +1 -0
- package/dist/idl_codegen/errors/custom.d.ts +730 -0
- package/dist/idl_codegen/errors/custom.js +1194 -0
- package/dist/idl_codegen/errors/custom.js.map +1 -0
- package/dist/idl_codegen/errors/index.d.ts +5 -0
- package/dist/idl_codegen/errors/index.js +71 -0
- package/dist/idl_codegen/errors/index.js.map +1 -0
- package/dist/idl_codegen/instructions/borrowObligationLiquidity.d.ts +20 -0
- package/dist/idl_codegen/instructions/borrowObligationLiquidity.js +75 -0
- package/dist/idl_codegen/instructions/borrowObligationLiquidity.js.map +1 -0
- package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.d.ts +9 -0
- package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.js +20 -0
- package/dist/idl_codegen/instructions/deleteReferrerStateAndShortUrl.js.map +1 -0
- package/dist/idl_codegen/instructions/depositObligationCollateral.d.ts +17 -0
- package/dist/idl_codegen/instructions/depositObligationCollateral.js +64 -0
- package/dist/idl_codegen/instructions/depositObligationCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidity.d.ts +19 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidity.js +74 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidity.js.map +1 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.d.ts +21 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.js +80 -0
- package/dist/idl_codegen/instructions/depositReserveLiquidityAndObligationCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.d.ts +20 -0
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.js +75 -0
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.js.map +1 -0
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.d.ts +21 -0
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.js +75 -0
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.js.map +1 -0
- package/dist/idl_codegen/instructions/idlMissingTypes.d.ts +18 -0
- package/dist/idl_codegen/instructions/idlMissingTypes.js +62 -0
- package/dist/idl_codegen/instructions/idlMissingTypes.js.map +1 -0
- package/dist/idl_codegen/instructions/index.d.ts +66 -0
- package/dist/idl_codegen/instructions/index.js +70 -0
- package/dist/idl_codegen/instructions/index.js.map +1 -0
- package/dist/idl_codegen/instructions/initFarmsForReserve.d.ts +19 -0
- package/dist/idl_codegen/instructions/initFarmsForReserve.js +63 -0
- package/dist/idl_codegen/instructions/initFarmsForReserve.js.map +1 -0
- package/dist/idl_codegen/instructions/initLendingMarket.d.ts +13 -0
- package/dist/idl_codegen/instructions/initLendingMarket.js +55 -0
- package/dist/idl_codegen/instructions/initLendingMarket.js.map +1 -0
- package/dist/idl_codegen/instructions/initObligation.d.ts +19 -0
- package/dist/idl_codegen/instructions/initObligation.js +55 -0
- package/dist/idl_codegen/instructions/initObligation.js.map +1 -0
- package/dist/idl_codegen/instructions/initObligationFarmsForReserve.d.ts +20 -0
- package/dist/idl_codegen/instructions/initObligationFarmsForReserve.js +60 -0
- package/dist/idl_codegen/instructions/initObligationFarmsForReserve.js.map +1 -0
- package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.d.ts +14 -0
- package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.js +54 -0
- package/dist/idl_codegen/instructions/initReferrerStateAndShortUrl.js.map +1 -0
- package/dist/idl_codegen/instructions/initReferrerTokenState.d.ts +14 -0
- package/dist/idl_codegen/instructions/initReferrerTokenState.js +50 -0
- package/dist/idl_codegen/instructions/initReferrerTokenState.js.map +1 -0
- package/dist/idl_codegen/instructions/initReserve.d.ts +16 -0
- package/dist/idl_codegen/instructions/initReserve.js +47 -0
- package/dist/idl_codegen/instructions/initReserve.js.map +1 -0
- package/dist/idl_codegen/instructions/initUserMetadata.d.ts +14 -0
- package/dist/idl_codegen/instructions/initUserMetadata.js +54 -0
- package/dist/idl_codegen/instructions/initUserMetadata.js.map +1 -0
- package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.d.ts +27 -0
- package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.js +102 -0
- package/dist/idl_codegen/instructions/liquidateObligationAndRedeemReserveCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/redeemFees.d.ts +10 -0
- package/dist/idl_codegen/instructions/redeemFees.js +33 -0
- package/dist/idl_codegen/instructions/redeemFees.js.map +1 -0
- package/dist/idl_codegen/instructions/redeemReserveCollateral.d.ts +19 -0
- package/dist/idl_codegen/instructions/redeemReserveCollateral.js +78 -0
- package/dist/idl_codegen/instructions/redeemReserveCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/refreshObligation.d.ts +6 -0
- package/dist/idl_codegen/instructions/refreshObligation.js +17 -0
- package/dist/idl_codegen/instructions/refreshObligation.js.map +1 -0
- package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.d.ts +19 -0
- package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.js +63 -0
- package/dist/idl_codegen/instructions/refreshObligationFarmsForReserve.js.map +1 -0
- package/dist/idl_codegen/instructions/refreshReserve.d.ts +10 -0
- package/dist/idl_codegen/instructions/refreshReserve.js +29 -0
- package/dist/idl_codegen/instructions/refreshReserve.js.map +1 -0
- package/dist/idl_codegen/instructions/repayObligationLiquidity.d.ts +17 -0
- package/dist/idl_codegen/instructions/repayObligationLiquidity.js +60 -0
- package/dist/idl_codegen/instructions/repayObligationLiquidity.js.map +1 -0
- package/dist/idl_codegen/instructions/requestElevationGroup.d.ts +11 -0
- package/dist/idl_codegen/instructions/requestElevationGroup.js +47 -0
- package/dist/idl_codegen/instructions/requestElevationGroup.js.map +1 -0
- package/dist/idl_codegen/instructions/socializeLoss.d.ts +14 -0
- package/dist/idl_codegen/instructions/socializeLoss.js +53 -0
- package/dist/idl_codegen/instructions/socializeLoss.js.map +1 -0
- package/dist/idl_codegen/instructions/updateEntireReserveConfig.d.ts +13 -0
- package/dist/idl_codegen/instructions/updateEntireReserveConfig.js +51 -0
- package/dist/idl_codegen/instructions/updateEntireReserveConfig.js.map +1 -0
- package/dist/idl_codegen/instructions/updateLendingMarket.d.ts +12 -0
- package/dist/idl_codegen/instructions/updateLendingMarket.js +50 -0
- package/dist/idl_codegen/instructions/updateLendingMarket.js.map +1 -0
- package/dist/idl_codegen/instructions/updateLendingMarketOwner.d.ts +6 -0
- package/dist/idl_codegen/instructions/updateLendingMarketOwner.js +21 -0
- package/dist/idl_codegen/instructions/updateLendingMarketOwner.js.map +1 -0
- package/dist/idl_codegen/instructions/updateReserveConfig.d.ts +13 -0
- package/dist/idl_codegen/instructions/updateReserveConfig.js +51 -0
- package/dist/idl_codegen/instructions/updateReserveConfig.js.map +1 -0
- package/dist/idl_codegen/instructions/updateSingleReserveConfig.d.ts +13 -0
- package/dist/idl_codegen/instructions/updateSingleReserveConfig.js +51 -0
- package/dist/idl_codegen/instructions/updateSingleReserveConfig.js.map +1 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateral.d.ts +18 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateral.js +69 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.d.ts +21 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.js +84 -0
- package/dist/idl_codegen/instructions/withdrawObligationCollateralAndRedeemReserveCollateral.js.map +1 -0
- package/dist/idl_codegen/instructions/withdrawProtocolFee.d.ts +16 -0
- package/dist/idl_codegen/instructions/withdrawProtocolFee.js +59 -0
- package/dist/idl_codegen/instructions/withdrawProtocolFee.js.map +1 -0
- package/dist/idl_codegen/instructions/withdrawReferrerFees.d.ts +12 -0
- package/dist/idl_codegen/instructions/withdrawReferrerFees.js +35 -0
- package/dist/idl_codegen/instructions/withdrawReferrerFees.js.map +1 -0
- package/dist/idl_codegen/programId.d.ts +4 -0
- package/dist/idl_codegen/programId.js +13 -0
- package/dist/idl_codegen/programId.js.map +1 -0
- package/dist/idl_codegen/types/AssetTier.d.ts +44 -0
- package/dist/idl_codegen/types/AssetTier.js +128 -0
- package/dist/idl_codegen/types/AssetTier.js.map +1 -0
- package/dist/idl_codegen/types/BigFractionBytes.d.ts +27 -0
- package/dist/idl_codegen/types/BigFractionBytes.js +73 -0
- package/dist/idl_codegen/types/BigFractionBytes.js.map +1 -0
- package/dist/idl_codegen/types/BorrowRateCurve.d.ts +27 -0
- package/dist/idl_codegen/types/BorrowRateCurve.js +62 -0
- package/dist/idl_codegen/types/BorrowRateCurve.js.map +1 -0
- package/dist/idl_codegen/types/CurvePoint.d.ts +26 -0
- package/dist/idl_codegen/types/CurvePoint.js +66 -0
- package/dist/idl_codegen/types/CurvePoint.js.map +1 -0
- package/dist/idl_codegen/types/ElevationGroup.d.ts +52 -0
- package/dist/idl_codegen/types/ElevationGroup.js +103 -0
- package/dist/idl_codegen/types/ElevationGroup.js.map +1 -0
- package/dist/idl_codegen/types/FeeCalculation.d.ts +31 -0
- package/dist/idl_codegen/types/FeeCalculation.js +102 -0
- package/dist/idl_codegen/types/FeeCalculation.js.map +1 -0
- package/dist/idl_codegen/types/InitObligationArgs.d.ts +26 -0
- package/dist/idl_codegen/types/InitObligationArgs.js +66 -0
- package/dist/idl_codegen/types/InitObligationArgs.js.map +1 -0
- package/dist/idl_codegen/types/LastUpdate.d.ts +47 -0
- package/dist/idl_codegen/types/LastUpdate.js +86 -0
- package/dist/idl_codegen/types/LastUpdate.js.map +1 -0
- package/dist/idl_codegen/types/ObligationCollateral.d.ts +48 -0
- package/dist/idl_codegen/types/ObligationCollateral.js +87 -0
- package/dist/idl_codegen/types/ObligationCollateral.js.map +1 -0
- package/dist/idl_codegen/types/ObligationLiquidity.d.ts +75 -0
- package/dist/idl_codegen/types/ObligationLiquidity.js +107 -0
- package/dist/idl_codegen/types/ObligationLiquidity.js.map +1 -0
- package/dist/idl_codegen/types/PriceHeuristic.d.ts +41 -0
- package/dist/idl_codegen/types/PriceHeuristic.js +75 -0
- package/dist/idl_codegen/types/PriceHeuristic.js.map +1 -0
- package/dist/idl_codegen/types/PythConfiguration.d.ts +25 -0
- package/dist/idl_codegen/types/PythConfiguration.js +62 -0
- package/dist/idl_codegen/types/PythConfiguration.js.map +1 -0
- package/dist/idl_codegen/types/ReserveCollateral.d.ts +53 -0
- package/dist/idl_codegen/types/ReserveCollateral.js +93 -0
- package/dist/idl_codegen/types/ReserveCollateral.js.map +1 -0
- package/dist/idl_codegen/types/ReserveConfig.d.ts +304 -0
- package/dist/idl_codegen/types/ReserveConfig.js +209 -0
- package/dist/idl_codegen/types/ReserveConfig.js.map +1 -0
- package/dist/idl_codegen/types/ReserveFarmKind.d.ts +31 -0
- package/dist/idl_codegen/types/ReserveFarmKind.js +102 -0
- package/dist/idl_codegen/types/ReserveFarmKind.js.map +1 -0
- package/dist/idl_codegen/types/ReserveFees.d.ts +78 -0
- package/dist/idl_codegen/types/ReserveFees.js +86 -0
- package/dist/idl_codegen/types/ReserveFees.js.map +1 -0
- package/dist/idl_codegen/types/ReserveLiquidity.d.ts +173 -0
- package/dist/idl_codegen/types/ReserveLiquidity.js +166 -0
- package/dist/idl_codegen/types/ReserveLiquidity.js.map +1 -0
- package/dist/idl_codegen/types/ReserveStatus.d.ts +44 -0
- package/dist/idl_codegen/types/ReserveStatus.js +128 -0
- package/dist/idl_codegen/types/ReserveStatus.js.map +1 -0
- package/dist/idl_codegen/types/ScopeConfiguration.d.ts +41 -0
- package/dist/idl_codegen/types/ScopeConfiguration.js +76 -0
- package/dist/idl_codegen/types/ScopeConfiguration.js.map +1 -0
- package/dist/idl_codegen/types/SwitchboardConfiguration.d.ts +30 -0
- package/dist/idl_codegen/types/SwitchboardConfiguration.js +67 -0
- package/dist/idl_codegen/types/SwitchboardConfiguration.js.map +1 -0
- package/dist/idl_codegen/types/TokenInfo.d.ts +109 -0
- package/dist/idl_codegen/types/TokenInfo.js +116 -0
- package/dist/idl_codegen/types/TokenInfo.js.map +1 -0
- package/dist/idl_codegen/types/UpdateConfigMode.d.ts +538 -0
- package/dist/idl_codegen/types/UpdateConfigMode.js +1116 -0
- package/dist/idl_codegen/types/UpdateConfigMode.js.map +1 -0
- package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.d.ts +155 -0
- package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.js +273 -0
- package/dist/idl_codegen/types/UpdateLendingMarketConfigValue.js.map +1 -0
- package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts +200 -0
- package/dist/idl_codegen/types/UpdateLendingMarketMode.js +440 -0
- package/dist/idl_codegen/types/UpdateLendingMarketMode.js.map +1 -0
- package/dist/idl_codegen/types/WithdrawalCaps.d.ts +38 -0
- package/dist/idl_codegen/types/WithdrawalCaps.js +86 -0
- package/dist/idl_codegen/types/WithdrawalCaps.js.map +1 -0
- package/dist/idl_codegen/types/index.d.ts +65 -0
- package/dist/idl_codegen/types/index.js +77 -0
- package/dist/idl_codegen/types/index.js.map +1 -0
- package/dist/idl_codegen/zero_padding/ObligationZP.d.ts +53 -0
- package/dist/idl_codegen/zero_padding/ObligationZP.js +140 -0
- package/dist/idl_codegen/zero_padding/ObligationZP.js.map +1 -0
- package/dist/idl_codegen/zero_padding/index.d.ts +1 -0
- package/dist/idl_codegen/zero_padding/index.js +6 -0
- package/dist/idl_codegen/zero_padding/index.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/accounts/Pool.d.ts +48 -0
- package/dist/idl_codegen_jupiter_perps/accounts/Pool.js +144 -0
- package/dist/idl_codegen_jupiter_perps/accounts/Pool.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/accounts/index.d.ts +2 -0
- package/dist/idl_codegen_jupiter_perps/accounts/index.js +6 -0
- package/dist/idl_codegen_jupiter_perps/accounts/index.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/programId.d.ts +3 -0
- package/dist/idl_codegen_jupiter_perps/programId.js +9 -0
- package/dist/idl_codegen_jupiter_perps/programId.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/types/Fees.d.ts +62 -0
- package/dist/idl_codegen_jupiter_perps/types/Fees.js +115 -0
- package/dist/idl_codegen_jupiter_perps/types/Fees.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/types/Limit.d.ts +32 -0
- package/dist/idl_codegen_jupiter_perps/types/Limit.js +75 -0
- package/dist/idl_codegen_jupiter_perps/types/Limit.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/types/PoolApr.d.ts +32 -0
- package/dist/idl_codegen_jupiter_perps/types/PoolApr.js +75 -0
- package/dist/idl_codegen_jupiter_perps/types/PoolApr.js.map +1 -0
- package/dist/idl_codegen_jupiter_perps/types/index.d.ts +6 -0
- package/dist/idl_codegen_jupiter_perps/types/index.js +10 -0
- package/dist/idl_codegen_jupiter_perps/types/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lending_operations/index.d.ts +2 -0
- package/dist/lending_operations/index.js +19 -0
- package/dist/lending_operations/index.js.map +1 -0
- package/dist/lending_operations/repay_with_collateral_calcs.d.ts +5 -0
- package/dist/lending_operations/repay_with_collateral_calcs.js +26 -0
- package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -0
- package/dist/lending_operations/repay_with_collateral_operations.d.ts +47 -0
- package/dist/lending_operations/repay_with_collateral_operations.js +163 -0
- package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -0
- package/dist/leverage/calcs.d.ts +132 -0
- package/dist/leverage/calcs.js +291 -0
- package/dist/leverage/calcs.js.map +1 -0
- package/dist/leverage/index.d.ts +4 -0
- package/dist/leverage/index.js +21 -0
- package/dist/leverage/index.js.map +1 -0
- package/dist/leverage/instructions.d.ts +43 -0
- package/dist/leverage/instructions.js +103 -0
- package/dist/leverage/instructions.js.map +1 -0
- package/dist/leverage/operations.d.ts +231 -0
- package/dist/leverage/operations.js +1058 -0
- package/dist/leverage/operations.js.map +1 -0
- package/dist/leverage/utils.d.ts +22 -0
- package/dist/leverage/utils.js +144 -0
- package/dist/leverage/utils.js.map +1 -0
- package/dist/lib.d.ts +9 -0
- package/dist/lib.js +26 -0
- package/dist/lib.js.map +1 -0
- package/dist/referrals/index.d.ts +2 -0
- package/dist/referrals/index.js +19 -0
- package/dist/referrals/index.js.map +1 -0
- package/dist/referrals/instructions.d.ts +16 -0
- package/dist/referrals/instructions.js +76 -0
- package/dist/referrals/instructions.js.map +1 -0
- package/dist/referrals/operations.d.ts +97 -0
- package/dist/referrals/operations.js +258 -0
- package/dist/referrals/operations.js.map +1 -0
- package/dist/utils/ObligationType.d.ts +49 -0
- package/dist/utils/ObligationType.js +129 -0
- package/dist/utils/ObligationType.js.map +1 -0
- package/dist/utils/api.d.ts +6 -0
- package/dist/utils/api.js +61 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/ata.d.ts +25 -0
- package/dist/utils/ata.js +155 -0
- package/dist/utils/ata.js.map +1 -0
- package/dist/utils/constants.d.ts +48 -0
- package/dist/utils/constants.js +75 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/idl.d.ts +2 -0
- package/dist/utils/idl.js +9 -0
- package/dist/utils/idl.js.map +1 -0
- package/dist/utils/index.d.ts +14 -0
- package/dist/utils/index.js +31 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/instruction.d.ts +22 -0
- package/dist/utils/instruction.js +202 -0
- package/dist/utils/instruction.js.map +1 -0
- package/dist/utils/kamino.d.ts +3 -0
- package/dist/utils/kamino.js +45 -0
- package/dist/utils/kamino.js.map +1 -0
- package/dist/utils/layout.d.ts +13 -0
- package/dist/utils/layout.js +123 -0
- package/dist/utils/layout.js.map +1 -0
- package/dist/utils/lookupTable.d.ts +5 -0
- package/dist/utils/lookupTable.js +57 -0
- package/dist/utils/lookupTable.js.map +1 -0
- package/dist/utils/oracle.d.ts +51 -0
- package/dist/utils/oracle.js +295 -0
- package/dist/utils/oracle.js.map +1 -0
- package/dist/utils/pubkey.d.ts +74 -0
- package/dist/utils/pubkey.js +229 -0
- package/dist/utils/pubkey.js.map +1 -0
- package/dist/utils/seeds.d.ts +122 -0
- package/dist/utils/seeds.js +153 -0
- package/dist/utils/seeds.js.map +1 -0
- package/dist/utils/slots.d.ts +18 -0
- package/dist/utils/slots.js +32 -0
- package/dist/utils/slots.js.map +1 -0
- package/dist/utils/syncNative.d.ts +10 -0
- package/dist/utils/syncNative.js +46 -0
- package/dist/utils/syncNative.js.map +1 -0
- package/dist/utils/userMetadata.d.ts +15 -0
- package/dist/utils/userMetadata.js +259 -0
- package/dist/utils/userMetadata.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.cacheOrGetScopePrice = exports.cacheOrGetSwitchboardPrice = exports.cacheOrGetPythPrices = exports.getAllOracleAccounts = exports.getTokenOracleData = exports.CONFIDENCE_FACTOR = exports.MAX_CONFIDENCE_PERCENTAGE = void 0;
|
|
16
|
+
const client_1 = require("@pythnetwork/client");
|
|
17
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
18
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
19
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
20
|
+
const scope_sdk_1 = require("@hubbleprotocol/scope-sdk");
|
|
21
|
+
const pubkey_1 = require("./pubkey");
|
|
22
|
+
const classes_1 = require("../classes");
|
|
23
|
+
const sbv2_lite_1 = __importDefault(require("@switchboard-xyz/sbv2-lite"));
|
|
24
|
+
const kamino_sdk_1 = require("@hubbleprotocol/kamino-sdk");
|
|
25
|
+
const SWITCHBOARD_V2_PROGRAM_ID = new web3_js_1.PublicKey('SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f');
|
|
26
|
+
// validate price confidence - confidence/price ratio should be less than 2%
|
|
27
|
+
exports.MAX_CONFIDENCE_PERCENTAGE = new decimal_js_1.default('2');
|
|
28
|
+
/// Confidence factor is used to scale the confidence value to a value that can be compared to the price.
|
|
29
|
+
exports.CONFIDENCE_FACTOR = new decimal_js_1.default('100').div(exports.MAX_CONFIDENCE_PERCENTAGE);
|
|
30
|
+
const getScopeAddress = () => {
|
|
31
|
+
return 'HFn8GnPADiny6XqUoWE8uRPPxb29ikn4yTuPa9MF2fWJ';
|
|
32
|
+
};
|
|
33
|
+
// TODO: Add freshness of the latest price to match sc logic
|
|
34
|
+
function getTokenOracleData(connection, reserves) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
const allOracleAccounts = yield getAllOracleAccounts(connection, reserves);
|
|
37
|
+
const tokenOracleDataForReserves = [];
|
|
38
|
+
const pythCache = new pubkey_1.PubkeyHashMap();
|
|
39
|
+
const switchboardCache = new pubkey_1.PubkeyHashMap();
|
|
40
|
+
const scopeCache = new pubkey_1.PubkeyHashMap();
|
|
41
|
+
let switchboardV2;
|
|
42
|
+
for (const reserve of reserves) {
|
|
43
|
+
let currentBest = undefined;
|
|
44
|
+
const oracle = {
|
|
45
|
+
pythAddress: reserve.config.tokenInfo.pythConfiguration.price,
|
|
46
|
+
switchboardFeedAddress: reserve.config.tokenInfo.switchboardConfiguration.priceAggregator,
|
|
47
|
+
switchboardTwapAddress: reserve.config.tokenInfo.switchboardConfiguration.twapAggregator,
|
|
48
|
+
scopeOracleAddress: reserve.config.tokenInfo.scopeConfiguration.priceFeed,
|
|
49
|
+
};
|
|
50
|
+
if ((0, pubkey_1.isNotNullPubkey)(oracle.pythAddress)) {
|
|
51
|
+
const pythPrices = cacheOrGetPythPrices(oracle.pythAddress, pythCache, allOracleAccounts);
|
|
52
|
+
if (pythPrices && pythPrices.spot) {
|
|
53
|
+
currentBest = getBestPrice(currentBest, pythPrices.spot);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if ((0, pubkey_1.isNotNullPubkey)(oracle.switchboardFeedAddress)) {
|
|
57
|
+
if (!switchboardV2) {
|
|
58
|
+
switchboardV2 = yield sbv2_lite_1.default.loadMainnet(connection);
|
|
59
|
+
}
|
|
60
|
+
const switchboardPrice = cacheOrGetSwitchboardPrice(oracle.switchboardFeedAddress, switchboardCache, allOracleAccounts, switchboardV2);
|
|
61
|
+
if (switchboardPrice) {
|
|
62
|
+
currentBest = getBestPrice(currentBest, switchboardPrice);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if ((0, pubkey_1.isNotNullPubkey)(oracle.scopeOracleAddress)) {
|
|
66
|
+
const scopePrice = cacheOrGetScopePrice(oracle.scopeOracleAddress, scopeCache, allOracleAccounts, reserve.config.tokenInfo.scopeConfiguration.priceChain);
|
|
67
|
+
if (scopePrice) {
|
|
68
|
+
currentBest = getBestPrice(currentBest, scopePrice);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!currentBest) {
|
|
72
|
+
console.error(`No price found for reserve: ${(0, classes_1.parseTokenSymbol)(reserve.config.tokenInfo.name)}`);
|
|
73
|
+
tokenOracleDataForReserves.push([reserve, undefined]);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const tokenOracleData = {
|
|
77
|
+
mintAddress: reserve.liquidity.mintPubkey,
|
|
78
|
+
decimals: decimal_js_1.default.pow(10, reserve.liquidity.mintDecimals.toString()),
|
|
79
|
+
price: new decimal_js_1.default(currentBest.price),
|
|
80
|
+
timestamp: currentBest.timestamp,
|
|
81
|
+
valid: currentBest.valid,
|
|
82
|
+
};
|
|
83
|
+
tokenOracleDataForReserves.push([reserve, tokenOracleData]);
|
|
84
|
+
}
|
|
85
|
+
return tokenOracleDataForReserves;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
exports.getTokenOracleData = getTokenOracleData;
|
|
89
|
+
function getAllOracleAccounts(connection, reserves) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const allAccounts = [];
|
|
92
|
+
reserves.forEach((reserve) => {
|
|
93
|
+
if ((0, pubkey_1.isNotNullPubkey)(reserve.config.tokenInfo.pythConfiguration.price)) {
|
|
94
|
+
allAccounts.push(reserve.config.tokenInfo.pythConfiguration.price);
|
|
95
|
+
}
|
|
96
|
+
if ((0, pubkey_1.isNotNullPubkey)(reserve.config.tokenInfo.switchboardConfiguration.priceAggregator)) {
|
|
97
|
+
allAccounts.push(reserve.config.tokenInfo.switchboardConfiguration.priceAggregator);
|
|
98
|
+
}
|
|
99
|
+
if ((0, pubkey_1.isNotNullPubkey)(reserve.config.tokenInfo.switchboardConfiguration.twapAggregator)) {
|
|
100
|
+
allAccounts.push(reserve.config.tokenInfo.switchboardConfiguration.twapAggregator);
|
|
101
|
+
}
|
|
102
|
+
if ((0, pubkey_1.isNotNullPubkey)(reserve.config.tokenInfo.scopeConfiguration.priceFeed)) {
|
|
103
|
+
allAccounts.push(reserve.config.tokenInfo.scopeConfiguration.priceFeed);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const allAccountsDeduped = dedupKeys(allAccounts);
|
|
107
|
+
const allAccs = yield (0, kamino_sdk_1.batchFetch)(allAccountsDeduped, (chunk) => connection.getMultipleAccountsInfo(chunk));
|
|
108
|
+
const allAccsMap = new pubkey_1.PubkeyHashMap();
|
|
109
|
+
allAccs.forEach((acc, i) => {
|
|
110
|
+
if (acc) {
|
|
111
|
+
allAccsMap.set(allAccountsDeduped[i], acc);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return allAccsMap;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
exports.getAllOracleAccounts = getAllOracleAccounts;
|
|
118
|
+
function dedupKeys(keys) {
|
|
119
|
+
return new pubkey_1.PublicKeySet(keys).toArray();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get pyth price from cache or fetch if not available
|
|
123
|
+
* @param oracle oracle address
|
|
124
|
+
* @param cache pyth cache
|
|
125
|
+
* @param oracleAccounts all oracle accounts
|
|
126
|
+
*/
|
|
127
|
+
function cacheOrGetPythPrices(oracle, cache, oracleAccounts) {
|
|
128
|
+
const prices = {};
|
|
129
|
+
const cached = cache.get(oracle);
|
|
130
|
+
if (cached) {
|
|
131
|
+
return cached;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const result = oracleAccounts.get(oracle);
|
|
135
|
+
if (result) {
|
|
136
|
+
try {
|
|
137
|
+
const { price, timestamp, emaPrice, previousPrice, previousTimestamp, confidence } = (0, client_1.parsePriceData)(result.data);
|
|
138
|
+
if (price) {
|
|
139
|
+
const px = new decimal_js_1.default(price);
|
|
140
|
+
prices.spot = {
|
|
141
|
+
price: px,
|
|
142
|
+
timestamp,
|
|
143
|
+
valid: validatePythPx(px, confidence),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
prices.spot = {
|
|
148
|
+
price: new decimal_js_1.default(previousPrice),
|
|
149
|
+
timestamp: previousTimestamp,
|
|
150
|
+
valid: false,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (emaPrice !== undefined && emaPrice !== null) {
|
|
154
|
+
prices.twap = {
|
|
155
|
+
price: new decimal_js_1.default(emaPrice.value),
|
|
156
|
+
timestamp,
|
|
157
|
+
valid: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (prices.spot || prices.twap) {
|
|
161
|
+
cache.set(oracle, prices);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`Error parsing pyth price account ${oracle.toString()} data`, error);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return prices;
|
|
174
|
+
}
|
|
175
|
+
exports.cacheOrGetPythPrices = cacheOrGetPythPrices;
|
|
176
|
+
/**
|
|
177
|
+
* Get switchboard price from cache or fetch if not available
|
|
178
|
+
* @param oracle oracle address
|
|
179
|
+
* @param switchboardCache cache for oracle prices
|
|
180
|
+
* @param oracleAccounts all oracle accounts
|
|
181
|
+
* @param switchboardV2 loaded switchboard program
|
|
182
|
+
*/
|
|
183
|
+
function cacheOrGetSwitchboardPrice(oracle, switchboardCache, oracleAccounts, switchboardV2) {
|
|
184
|
+
const cached = switchboardCache.get(oracle);
|
|
185
|
+
if (cached) {
|
|
186
|
+
return cached;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const info = oracleAccounts.get(oracle);
|
|
190
|
+
if (info) {
|
|
191
|
+
if (info.owner.equals(SWITCHBOARD_V2_PROGRAM_ID)) {
|
|
192
|
+
const agg = switchboardV2.decodeAggregator(info);
|
|
193
|
+
// @ts-ignore
|
|
194
|
+
const result = switchboardV2.getLatestAggregatorValue(agg);
|
|
195
|
+
if (result !== undefined && result !== null) {
|
|
196
|
+
const switchboardPx = new decimal_js_1.default(result.toString());
|
|
197
|
+
const latestRoundTimestamp = agg.latestConfirmedRound.roundOpenTimestamp;
|
|
198
|
+
const ts = BigInt(latestRoundTimestamp.toString());
|
|
199
|
+
const valid = validateSwitchboardV2Px(agg);
|
|
200
|
+
return {
|
|
201
|
+
price: switchboardPx,
|
|
202
|
+
timestamp: ts,
|
|
203
|
+
valid,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
console.error('Unrecognized switchboard owner address: ', info.owner.toString());
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
exports.cacheOrGetSwitchboardPrice = cacheOrGetSwitchboardPrice;
|
|
216
|
+
/**
|
|
217
|
+
* Get scope price from cache or fetch if not available
|
|
218
|
+
* @param oracle oracle address
|
|
219
|
+
* @param scopeCache cache for oracle prices
|
|
220
|
+
* @param allOracleAccounts all oracle accounts
|
|
221
|
+
* @param chain scope chain
|
|
222
|
+
*/
|
|
223
|
+
function cacheOrGetScopePrice(oracle, scopeCache, allOracleAccounts, chain) {
|
|
224
|
+
if (!(0, pubkey_1.isNotNullPubkey)(oracle) || !chain || !scope_sdk_1.Scope.isScopeChainValid(chain)) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
const scopePrices = scopeCache.get(oracle);
|
|
228
|
+
if (scopePrices) {
|
|
229
|
+
return scopeChainToCandidatePrice(chain, scopePrices);
|
|
230
|
+
}
|
|
231
|
+
const info = allOracleAccounts.get(oracle);
|
|
232
|
+
if (info) {
|
|
233
|
+
const owner = info.owner.toString();
|
|
234
|
+
if (owner === getScopeAddress()) {
|
|
235
|
+
const prices = scope_sdk_1.OraclePrices.decode(info.data);
|
|
236
|
+
scopeCache.set(oracle, prices);
|
|
237
|
+
return scopeChainToCandidatePrice(chain, prices);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.error('Unrecognized scope owner address: ', owner);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
exports.cacheOrGetScopePrice = cacheOrGetScopePrice;
|
|
246
|
+
function getBestPrice(current, next) {
|
|
247
|
+
if (isBetterPrice(current, next)) {
|
|
248
|
+
return next;
|
|
249
|
+
}
|
|
250
|
+
return current;
|
|
251
|
+
}
|
|
252
|
+
function isBetterPrice(current, next) {
|
|
253
|
+
if (!current) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (current.valid && !next.valid) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
if (!current.valid && next.valid) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
return next.timestamp > current.timestamp;
|
|
263
|
+
}
|
|
264
|
+
function validatePythPx(price, confidence) {
|
|
265
|
+
const conf50x = new decimal_js_1.default(confidence || 0).mul(exports.CONFIDENCE_FACTOR);
|
|
266
|
+
return price.gt(conf50x);
|
|
267
|
+
}
|
|
268
|
+
function validateSwitchboardV2Px(agg) {
|
|
269
|
+
const pxMantissa = new decimal_js_1.default(agg.latestConfirmedRound.result.mantissa.toString());
|
|
270
|
+
const pxScale = new decimal_js_1.default(agg.latestConfirmedRound.result.scale.toString());
|
|
271
|
+
const stDevMantissa = new decimal_js_1.default(agg.latestConfirmedRound.stdDeviation.mantissa.toString());
|
|
272
|
+
const stDevScale = new decimal_js_1.default(agg.latestConfirmedRound.stdDeviation.scale.toString());
|
|
273
|
+
let conf50xScaled;
|
|
274
|
+
if (pxScale.gte(stDevScale)) {
|
|
275
|
+
const scalingFactor = pxScale.sub(stDevScale);
|
|
276
|
+
const conf50x = stDevMantissa.mul(exports.CONFIDENCE_FACTOR);
|
|
277
|
+
conf50xScaled = conf50x.mul(scalingFactor);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
const scalingFactor = stDevScale.sub(pxScale);
|
|
281
|
+
const conf50x = stDevMantissa.mul(exports.CONFIDENCE_FACTOR);
|
|
282
|
+
conf50xScaled = conf50x.div(scalingFactor);
|
|
283
|
+
}
|
|
284
|
+
return conf50xScaled.gte(pxMantissa);
|
|
285
|
+
}
|
|
286
|
+
function scopeChainToCandidatePrice(chain, prices) {
|
|
287
|
+
const scopePx = scope_sdk_1.Scope.getPriceFromScopeChain(chain, prices);
|
|
288
|
+
const valid = scopePx.timestamp.gt('0'); // scope prices are pre-validated
|
|
289
|
+
return {
|
|
290
|
+
price: scopePx.price,
|
|
291
|
+
timestamp: BigInt(scopePx.timestamp.toString()),
|
|
292
|
+
valid,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/utils/oracle.ts"],"names":[],"mappings":"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","sourcesContent":["import { parsePriceData } from '@pythnetwork/client';\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { OraclePrices, Scope } from '@hubbleprotocol/scope-sdk';\nimport { isNotNullPubkey, PubkeyHashMap, PublicKeySet } from './pubkey';\nimport { parseTokenSymbol } from '../classes';\nimport SwitchboardProgram from '@switchboard-xyz/sbv2-lite';\nimport { Reserve } from '../lib';\nimport { batchFetch } from '@hubbleprotocol/kamino-sdk';\nimport BN from 'bn.js';\n\nconst SWITCHBOARD_V2_PROGRAM_ID = new PublicKey('SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f');\n\n// validate price confidence - confidence/price ratio should be less than 2%\nexport const MAX_CONFIDENCE_PERCENTAGE: Decimal = new Decimal('2');\n\n/// Confidence factor is used to scale the confidence value to a value that can be compared to the price.\nexport const CONFIDENCE_FACTOR: Decimal = new Decimal('100').div(MAX_CONFIDENCE_PERCENTAGE);\n\nconst getScopeAddress = () => {\n return 'HFn8GnPADiny6XqUoWE8uRPPxb29ikn4yTuPa9MF2fWJ';\n};\n\nexport type TokenOracleData = {\n mintAddress: PublicKey;\n decimals: Decimal;\n price: Decimal;\n timestamp: bigint;\n valid: boolean;\n};\n\nexport type CandidatePrice = {\n price: Decimal;\n timestamp: bigint;\n valid: boolean;\n};\n\n// TODO: Add freshness of the latest price to match sc logic\nexport async function getTokenOracleData(\n connection: Connection,\n reserves: Reserve[]\n): Promise<Array<[Reserve, TokenOracleData | undefined]>> {\n const allOracleAccounts = await getAllOracleAccounts(connection, reserves);\n const tokenOracleDataForReserves: Array<[Reserve, TokenOracleData | undefined]> = [];\n const pythCache = new PubkeyHashMap<PublicKey, PythPrices>();\n const switchboardCache = new PubkeyHashMap<PublicKey, CandidatePrice>();\n const scopeCache = new PubkeyHashMap<PublicKey, OraclePrices>();\n let switchboardV2: SwitchboardProgram | undefined;\n for (const reserve of reserves) {\n let currentBest: CandidatePrice | undefined = undefined;\n const oracle = {\n pythAddress: reserve.config.tokenInfo.pythConfiguration.price,\n switchboardFeedAddress: reserve.config.tokenInfo.switchboardConfiguration.priceAggregator,\n switchboardTwapAddress: reserve.config.tokenInfo.switchboardConfiguration.twapAggregator,\n scopeOracleAddress: reserve.config.tokenInfo.scopeConfiguration.priceFeed,\n };\n if (isNotNullPubkey(oracle.pythAddress)) {\n const pythPrices = cacheOrGetPythPrices(oracle.pythAddress, pythCache, allOracleAccounts);\n if (pythPrices && pythPrices.spot) {\n currentBest = getBestPrice(currentBest, pythPrices.spot);\n }\n }\n if (isNotNullPubkey(oracle.switchboardFeedAddress)) {\n if (!switchboardV2) {\n switchboardV2 = await SwitchboardProgram.loadMainnet(connection);\n }\n const switchboardPrice = cacheOrGetSwitchboardPrice(\n oracle.switchboardFeedAddress,\n switchboardCache,\n allOracleAccounts,\n switchboardV2\n );\n if (switchboardPrice) {\n currentBest = getBestPrice(currentBest, switchboardPrice);\n }\n }\n\n if (isNotNullPubkey(oracle.scopeOracleAddress)) {\n const scopePrice = cacheOrGetScopePrice(\n oracle.scopeOracleAddress,\n scopeCache,\n allOracleAccounts,\n reserve.config.tokenInfo.scopeConfiguration.priceChain\n );\n if (scopePrice) {\n currentBest = getBestPrice(currentBest, scopePrice);\n }\n }\n\n if (!currentBest) {\n console.error(`No price found for reserve: ${parseTokenSymbol(reserve.config.tokenInfo.name)}`);\n tokenOracleDataForReserves.push([reserve, undefined]);\n continue;\n }\n const tokenOracleData: TokenOracleData = {\n mintAddress: reserve.liquidity.mintPubkey,\n decimals: Decimal.pow(10, reserve.liquidity.mintDecimals.toString()),\n price: new Decimal(currentBest.price),\n timestamp: currentBest.timestamp,\n valid: currentBest.valid,\n };\n tokenOracleDataForReserves.push([reserve, tokenOracleData]);\n }\n return tokenOracleDataForReserves;\n}\n\nexport type AllOracleAccounts = PubkeyHashMap<PublicKey, AccountInfo<Buffer>>;\n\nexport async function getAllOracleAccounts(connection: Connection, reserves: Reserve[]): Promise<AllOracleAccounts> {\n const allAccounts: PublicKey[] = [];\n reserves.forEach((reserve) => {\n if (isNotNullPubkey(reserve.config.tokenInfo.pythConfiguration.price)) {\n allAccounts.push(reserve.config.tokenInfo.pythConfiguration.price);\n }\n if (isNotNullPubkey(reserve.config.tokenInfo.switchboardConfiguration.priceAggregator)) {\n allAccounts.push(reserve.config.tokenInfo.switchboardConfiguration.priceAggregator);\n }\n if (isNotNullPubkey(reserve.config.tokenInfo.switchboardConfiguration.twapAggregator)) {\n allAccounts.push(reserve.config.tokenInfo.switchboardConfiguration.twapAggregator);\n }\n if (isNotNullPubkey(reserve.config.tokenInfo.scopeConfiguration.priceFeed)) {\n allAccounts.push(reserve.config.tokenInfo.scopeConfiguration.priceFeed);\n }\n });\n const allAccountsDeduped = dedupKeys(allAccounts);\n const allAccs = await batchFetch(allAccountsDeduped, (chunk) => connection.getMultipleAccountsInfo(chunk));\n const allAccsMap = new PubkeyHashMap<PublicKey, AccountInfo<Buffer>>();\n allAccs.forEach((acc, i) => {\n if (acc) {\n allAccsMap.set(allAccountsDeduped[i], acc);\n }\n });\n return allAccsMap;\n}\n\nfunction dedupKeys(keys: PublicKey[]): PublicKey[] {\n return new PublicKeySet(keys).toArray();\n}\n\nexport type PythPrices = {\n spot?: CandidatePrice;\n twap?: CandidatePrice;\n};\n\n/**\n * Get pyth price from cache or fetch if not available\n * @param oracle oracle address\n * @param cache pyth cache\n * @param oracleAccounts all oracle accounts\n */\nexport function cacheOrGetPythPrices(\n oracle: PublicKey,\n cache: Map<PublicKey, PythPrices>,\n oracleAccounts: AllOracleAccounts\n): PythPrices | null {\n const prices: PythPrices = {};\n const cached = cache.get(oracle);\n if (cached) {\n return cached;\n } else {\n const result = oracleAccounts.get(oracle);\n if (result) {\n try {\n const { price, timestamp, emaPrice, previousPrice, previousTimestamp, confidence } = parsePriceData(\n result.data\n );\n if (price) {\n const px = new Decimal(price);\n prices.spot = {\n price: px,\n timestamp,\n valid: validatePythPx(px, confidence),\n };\n } else {\n prices.spot = {\n price: new Decimal(previousPrice),\n timestamp: previousTimestamp,\n valid: false,\n };\n }\n if (emaPrice !== undefined && emaPrice !== null) {\n prices.twap = {\n price: new Decimal(emaPrice.value),\n timestamp,\n valid: true,\n };\n }\n if (prices.spot || prices.twap) {\n cache.set(oracle, prices);\n }\n } catch (error) {\n console.error(`Error parsing pyth price account ${oracle.toString()} data`, error);\n return null;\n }\n } else {\n return null;\n }\n }\n return prices;\n}\n\n/**\n * Get switchboard price from cache or fetch if not available\n * @param oracle oracle address\n * @param switchboardCache cache for oracle prices\n * @param oracleAccounts all oracle accounts\n * @param switchboardV2 loaded switchboard program\n */\nexport function cacheOrGetSwitchboardPrice(\n oracle: PublicKey,\n switchboardCache: Map<PublicKey, CandidatePrice>,\n oracleAccounts: AllOracleAccounts,\n switchboardV2: SwitchboardProgram\n): CandidatePrice | null {\n const cached = switchboardCache.get(oracle);\n if (cached) {\n return cached;\n } else {\n const info = oracleAccounts.get(oracle);\n if (info) {\n if (info.owner.equals(SWITCHBOARD_V2_PROGRAM_ID)) {\n const agg = switchboardV2.decodeAggregator(info!);\n // @ts-ignore\n const result: Big.Big | null = switchboardV2.getLatestAggregatorValue(agg);\n if (result !== undefined && result !== null) {\n const switchboardPx = new Decimal(result.toString());\n const latestRoundTimestamp: BN = agg.latestConfirmedRound.roundOpenTimestamp;\n const ts = BigInt(latestRoundTimestamp.toString());\n const valid = validateSwitchboardV2Px(agg);\n return {\n price: switchboardPx,\n timestamp: ts,\n valid,\n };\n }\n } else {\n console.error('Unrecognized switchboard owner address: ', info.owner.toString());\n return null;\n }\n }\n }\n return null;\n}\n\n/**\n * Get scope price from cache or fetch if not available\n * @param oracle oracle address\n * @param scopeCache cache for oracle prices\n * @param allOracleAccounts all oracle accounts\n * @param chain scope chain\n */\nexport function cacheOrGetScopePrice(\n oracle: PublicKey,\n scopeCache: Map<PublicKey, OraclePrices>,\n allOracleAccounts: AllOracleAccounts,\n chain: number[]\n): CandidatePrice | null {\n if (!isNotNullPubkey(oracle) || !chain || !Scope.isScopeChainValid(chain)) {\n return null;\n }\n\n const scopePrices = scopeCache.get(oracle);\n if (scopePrices) {\n return scopeChainToCandidatePrice(chain, scopePrices);\n }\n const info = allOracleAccounts.get(oracle);\n if (info) {\n const owner = info.owner.toString();\n if (owner === getScopeAddress()) {\n const prices = OraclePrices.decode(info.data);\n scopeCache.set(oracle, prices);\n return scopeChainToCandidatePrice(chain, prices);\n } else {\n console.error('Unrecognized scope owner address: ', owner);\n }\n }\n\n return null;\n}\n\nfunction getBestPrice(current: CandidatePrice | undefined, next: CandidatePrice): CandidatePrice | undefined {\n if (isBetterPrice(current, next)) {\n return next;\n }\n return current;\n}\n\nfunction isBetterPrice(current: CandidatePrice | undefined, next: CandidatePrice): boolean {\n if (!current) {\n return true;\n }\n if (current.valid && !next.valid) {\n return false;\n }\n if (!current.valid && next.valid) {\n return true;\n }\n return next.timestamp > current.timestamp;\n}\n\nfunction validatePythPx(price: Decimal, confidence: number | undefined): boolean {\n const conf50x = new Decimal(confidence || 0).mul(CONFIDENCE_FACTOR);\n return price.gt(conf50x);\n}\n\nfunction validateSwitchboardV2Px(agg: any): boolean {\n const pxMantissa = new Decimal(agg.latestConfirmedRound.result.mantissa.toString());\n const pxScale = new Decimal(agg.latestConfirmedRound.result.scale.toString());\n const stDevMantissa = new Decimal(agg.latestConfirmedRound.stdDeviation.mantissa.toString());\n const stDevScale = new Decimal(agg.latestConfirmedRound.stdDeviation.scale.toString());\n let conf50xScaled: Decimal;\n if (pxScale.gte(stDevScale)) {\n const scalingFactor = pxScale.sub(stDevScale);\n const conf50x = stDevMantissa.mul(CONFIDENCE_FACTOR);\n conf50xScaled = conf50x.mul(scalingFactor);\n } else {\n const scalingFactor = stDevScale.sub(pxScale);\n const conf50x = stDevMantissa.mul(CONFIDENCE_FACTOR);\n conf50xScaled = conf50x.div(scalingFactor);\n }\n return conf50xScaled.gte(pxMantissa);\n}\n\nfunction scopeChainToCandidatePrice(chain: number[], prices: OraclePrices): CandidatePrice {\n const scopePx = Scope.getPriceFromScopeChain(chain, prices);\n const valid = scopePx.timestamp.gt('0'); // scope prices are pre-validated\n return {\n price: scopePx.price,\n timestamp: BigInt(scopePx.timestamp.toString()),\n valid,\n };\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { PublicKey } from '@solana/web3.js';
|
|
3
|
+
import BN from 'bn.js';
|
|
4
|
+
export declare const NULL_PUBKEY: PublicKey;
|
|
5
|
+
export declare const COMPUTE_BUDGET_PROGRAM_ID: PublicKey;
|
|
6
|
+
/**
|
|
7
|
+
* Helper function to check if a configured pubkey is null or default.
|
|
8
|
+
* @param pubkey
|
|
9
|
+
* @returns {boolean}
|
|
10
|
+
*/
|
|
11
|
+
export declare function isNotNullPubkey(pubkey: PublicKey): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Custom set implementation for PublicKey
|
|
14
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom set implementation where keys are compared with `PublicKey.equals(PublicKey)`
|
|
15
|
+
*/
|
|
16
|
+
export declare class PublicKeySet<T extends PublicKey> {
|
|
17
|
+
private items;
|
|
18
|
+
constructor(items: Array<T>);
|
|
19
|
+
add(item: T): void;
|
|
20
|
+
contains(item: T): boolean;
|
|
21
|
+
private equals;
|
|
22
|
+
isEmpty(): boolean;
|
|
23
|
+
toArray(): T[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Custom map implementation for PublicKey, backed by a list for o(n) lookup speed
|
|
27
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`
|
|
28
|
+
*/
|
|
29
|
+
export declare class PublicKeyMap<K extends PublicKey, V> {
|
|
30
|
+
private record;
|
|
31
|
+
set(key: K, value: V): void;
|
|
32
|
+
get(key: K): V | undefined;
|
|
33
|
+
has(key: K): boolean;
|
|
34
|
+
delete(key: K): void;
|
|
35
|
+
private findIndex;
|
|
36
|
+
clear(): void;
|
|
37
|
+
forEach(callback: (value: V, key: K) => void): void;
|
|
38
|
+
keys(): K[];
|
|
39
|
+
values(): V[];
|
|
40
|
+
entries(): [K, V][];
|
|
41
|
+
isEmpty(): boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Custom map implementation for PublicKey, backed by a hashmap for o(1) lookup speed
|
|
45
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`, and a hash is derived from the final 32 bits of the public key
|
|
46
|
+
*/
|
|
47
|
+
export declare class PubkeyHashMap<K extends PublicKey, V> implements Map<K, V> {
|
|
48
|
+
private buckets;
|
|
49
|
+
size: number;
|
|
50
|
+
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
51
|
+
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
52
|
+
[Symbol.toStringTag]: string;
|
|
53
|
+
set(key: K, value: V): this;
|
|
54
|
+
get(key: K): V | undefined;
|
|
55
|
+
has(key: K): boolean;
|
|
56
|
+
delete(key: K): boolean;
|
|
57
|
+
clear(): void;
|
|
58
|
+
isEmpty(): boolean;
|
|
59
|
+
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
|
|
60
|
+
keys(): IterableIterator<K>;
|
|
61
|
+
values(): IterableIterator<V>;
|
|
62
|
+
entries(): IterableIterator<[K, V]>;
|
|
63
|
+
}
|
|
64
|
+
export declare class HashablePublicKey extends PublicKey implements IEquality<HashablePublicKey> {
|
|
65
|
+
static MASK: BN;
|
|
66
|
+
constructor(value: PublicKey | string | Buffer | Uint8Array | Array<number>);
|
|
67
|
+
hashCode(): number;
|
|
68
|
+
private getBN;
|
|
69
|
+
}
|
|
70
|
+
interface IEquality<T extends IEquality<T>> {
|
|
71
|
+
equals(other: T): boolean;
|
|
72
|
+
hashCode(): number;
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
var _a;
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.HashablePublicKey = exports.PubkeyHashMap = exports.PublicKeyMap = exports.PublicKeySet = exports.isNotNullPubkey = exports.COMPUTE_BUDGET_PROGRAM_ID = exports.NULL_PUBKEY = void 0;
|
|
8
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
10
|
+
exports.NULL_PUBKEY = new web3_js_1.PublicKey('nu11111111111111111111111111111111111111111');
|
|
11
|
+
exports.COMPUTE_BUDGET_PROGRAM_ID = new web3_js_1.PublicKey('ComputeBudget111111111111111111111111111111');
|
|
12
|
+
/**
|
|
13
|
+
* Helper function to check if a configured pubkey is null or default.
|
|
14
|
+
* @param pubkey
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
function isNotNullPubkey(pubkey) {
|
|
18
|
+
return pubkey && !pubkey.equals(exports.NULL_PUBKEY) && !pubkey.equals(web3_js_1.PublicKey.default);
|
|
19
|
+
}
|
|
20
|
+
exports.isNotNullPubkey = isNotNullPubkey;
|
|
21
|
+
/**
|
|
22
|
+
* Custom set implementation for PublicKey
|
|
23
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom set implementation where keys are compared with `PublicKey.equals(PublicKey)`
|
|
24
|
+
*/
|
|
25
|
+
class PublicKeySet {
|
|
26
|
+
constructor(items) {
|
|
27
|
+
this.items = [];
|
|
28
|
+
items.forEach((item) => this.add(item));
|
|
29
|
+
}
|
|
30
|
+
add(item) {
|
|
31
|
+
if (!this.contains(item)) {
|
|
32
|
+
this.items.push(item);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
contains(item) {
|
|
36
|
+
return this.items.some((existingItem) => this.equals(existingItem, item));
|
|
37
|
+
}
|
|
38
|
+
equals(item1, item2) {
|
|
39
|
+
return item1.equals(item2);
|
|
40
|
+
}
|
|
41
|
+
isEmpty() {
|
|
42
|
+
return this.items.length === 0;
|
|
43
|
+
}
|
|
44
|
+
toArray() {
|
|
45
|
+
return this.items.slice(); // Return a copy of the array to prevent external modifications
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.PublicKeySet = PublicKeySet;
|
|
49
|
+
/**
|
|
50
|
+
* Custom map implementation for PublicKey, backed by a list for o(n) lookup speed
|
|
51
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`
|
|
52
|
+
*/
|
|
53
|
+
class PublicKeyMap {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.record = [];
|
|
56
|
+
}
|
|
57
|
+
set(key, value) {
|
|
58
|
+
const index = this.findIndex(key);
|
|
59
|
+
if (index !== -1) {
|
|
60
|
+
// Update existing entry
|
|
61
|
+
this.record[index].value = value;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Add new entry
|
|
65
|
+
this.record.push({ key, value });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
get(key) {
|
|
69
|
+
const index = this.findIndex(key);
|
|
70
|
+
return index !== -1 ? this.record[index].value : undefined;
|
|
71
|
+
}
|
|
72
|
+
has(key) {
|
|
73
|
+
return this.findIndex(key) !== -1;
|
|
74
|
+
}
|
|
75
|
+
delete(key) {
|
|
76
|
+
const index = this.findIndex(key);
|
|
77
|
+
if (index !== -1) {
|
|
78
|
+
this.record.splice(index, 1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
findIndex(key) {
|
|
82
|
+
return this.record.findIndex((entry) => entry.key.equals(key));
|
|
83
|
+
}
|
|
84
|
+
clear() {
|
|
85
|
+
this.record = [];
|
|
86
|
+
}
|
|
87
|
+
forEach(callback) {
|
|
88
|
+
this.record.forEach((entry) => {
|
|
89
|
+
callback(entry.value, entry.key);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
keys() {
|
|
93
|
+
return this.record.map((entry) => entry.key);
|
|
94
|
+
}
|
|
95
|
+
values() {
|
|
96
|
+
return this.record.map((entry) => entry.value);
|
|
97
|
+
}
|
|
98
|
+
entries() {
|
|
99
|
+
return this.record.map((entry) => [entry.key, entry.value]);
|
|
100
|
+
}
|
|
101
|
+
isEmpty() {
|
|
102
|
+
return this.record.length === 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.PublicKeyMap = PublicKeyMap;
|
|
106
|
+
/**
|
|
107
|
+
* Custom map implementation for PublicKey, backed by a hashmap for o(1) lookup speed
|
|
108
|
+
* Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`, and a hash is derived from the final 32 bits of the public key
|
|
109
|
+
*/
|
|
110
|
+
class PubkeyHashMap {
|
|
111
|
+
constructor(entries) {
|
|
112
|
+
this[_a] = 'PubkeyHashMap';
|
|
113
|
+
this.buckets = new Map();
|
|
114
|
+
this.size = 0;
|
|
115
|
+
if (entries) {
|
|
116
|
+
for (const [key, value] of entries) {
|
|
117
|
+
this.set(key, value);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
*[Symbol.iterator]() {
|
|
122
|
+
for (const [, bucket] of this.buckets) {
|
|
123
|
+
for (const { key, value } of bucket) {
|
|
124
|
+
yield [key, value];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
set(key, value) {
|
|
129
|
+
const hash = new HashablePublicKey(key).hashCode();
|
|
130
|
+
const bucket = this.buckets.get(hash);
|
|
131
|
+
if (!bucket) {
|
|
132
|
+
this.buckets.set(hash, [{ key, value }]);
|
|
133
|
+
this.size++;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const entry = bucket.find((entry) => entry.key.equals(key));
|
|
137
|
+
if (entry) {
|
|
138
|
+
entry.value = value;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
bucket.push({ key, value });
|
|
142
|
+
this.size++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
get(key) {
|
|
148
|
+
const hash = new HashablePublicKey(key).hashCode();
|
|
149
|
+
const bucket = this.buckets.get(hash);
|
|
150
|
+
if (!bucket) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
const entry = bucket.find((entry) => entry.key.equals(key));
|
|
154
|
+
return entry ? entry.value : undefined;
|
|
155
|
+
}
|
|
156
|
+
has(key) {
|
|
157
|
+
const hash = new HashablePublicKey(key).hashCode();
|
|
158
|
+
const bucket = this.buckets.get(hash);
|
|
159
|
+
if (!bucket) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
const entry = bucket.find((entry) => entry.key.equals(key));
|
|
163
|
+
return !!entry;
|
|
164
|
+
}
|
|
165
|
+
delete(key) {
|
|
166
|
+
const hash = new HashablePublicKey(key).hashCode();
|
|
167
|
+
const bucket = this.buckets.get(hash);
|
|
168
|
+
if (!bucket) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
const index = bucket.findIndex((entry) => entry.key.equals(key));
|
|
172
|
+
if (index === -1) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
bucket.splice(index, 1);
|
|
176
|
+
if (bucket.length === 0) {
|
|
177
|
+
this.buckets.delete(hash);
|
|
178
|
+
}
|
|
179
|
+
this.size--;
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
clear() {
|
|
183
|
+
this.buckets = new Map();
|
|
184
|
+
this.size = 0;
|
|
185
|
+
}
|
|
186
|
+
isEmpty() {
|
|
187
|
+
return this.size === 0;
|
|
188
|
+
}
|
|
189
|
+
forEach(callbackfn, thisArg) {
|
|
190
|
+
this.buckets.forEach((bucket) => {
|
|
191
|
+
bucket.forEach((entry) => {
|
|
192
|
+
callbackfn(entry.value, entry.key, this);
|
|
193
|
+
}, thisArg);
|
|
194
|
+
}, thisArg);
|
|
195
|
+
}
|
|
196
|
+
*keys() {
|
|
197
|
+
for (const [key] of this) {
|
|
198
|
+
yield key;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
*values() {
|
|
202
|
+
for (const [, value] of this) {
|
|
203
|
+
yield value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
entries() {
|
|
207
|
+
return this[Symbol.iterator]();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.PubkeyHashMap = PubkeyHashMap;
|
|
211
|
+
_a = Symbol.toStringTag;
|
|
212
|
+
class HashablePublicKey extends web3_js_1.PublicKey {
|
|
213
|
+
constructor(value) {
|
|
214
|
+
super(value);
|
|
215
|
+
}
|
|
216
|
+
hashCode() {
|
|
217
|
+
let hash = 13;
|
|
218
|
+
hash = hash * 7 + this.getBN().clone().iuand(HashablePublicKey.MASK).toNumber();
|
|
219
|
+
return hash;
|
|
220
|
+
}
|
|
221
|
+
getBN() {
|
|
222
|
+
//@ts-ignore
|
|
223
|
+
return this._bn;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
exports.HashablePublicKey = HashablePublicKey;
|
|
227
|
+
// We only use the last 32 bits of the public key for hashing
|
|
228
|
+
HashablePublicKey.MASK = new bn_js_1.default(1).shln(32).subn(1);
|
|
229
|
+
//# sourceMappingURL=pubkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubkey.js","sourceRoot":"","sources":["../../src/utils/pubkey.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport BN from 'bn.js';\n\nexport const NULL_PUBKEY = new PublicKey('nu11111111111111111111111111111111111111111');\nexport const COMPUTE_BUDGET_PROGRAM_ID = new PublicKey('ComputeBudget111111111111111111111111111111');\n\n/**\n * Helper function to check if a configured pubkey is null or default.\n * @param pubkey\n * @returns {boolean}\n */\nexport function isNotNullPubkey(pubkey: PublicKey): boolean {\n return pubkey && !pubkey.equals(NULL_PUBKEY) && !pubkey.equals(PublicKey.default);\n}\n\n/**\n * Custom set implementation for PublicKey\n * Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom set implementation where keys are compared with `PublicKey.equals(PublicKey)`\n */\nexport class PublicKeySet<T extends PublicKey> {\n private items: T[] = [];\n\n constructor(items: Array<T>) {\n items.forEach((item) => this.add(item));\n }\n\n add(item: T): void {\n if (!this.contains(item)) {\n this.items.push(item);\n }\n }\n\n contains(item: T): boolean {\n return this.items.some((existingItem) => this.equals(existingItem, item));\n }\n\n private equals(item1: T, item2: T): boolean {\n return item1.equals(item2);\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n toArray(): T[] {\n return this.items.slice(); // Return a copy of the array to prevent external modifications\n }\n}\n\n/**\n * Custom map implementation for PublicKey, backed by a list for o(n) lookup speed\n * Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`\n */\nexport class PublicKeyMap<K extends PublicKey, V> {\n private record: { key: K; value: V }[] = [];\n\n set(key: K, value: V): void {\n const index = this.findIndex(key);\n if (index !== -1) {\n // Update existing entry\n this.record[index].value = value;\n } else {\n // Add new entry\n this.record.push({ key, value });\n }\n }\n\n get(key: K): V | undefined {\n const index = this.findIndex(key);\n return index !== -1 ? this.record[index].value : undefined;\n }\n\n has(key: K): boolean {\n return this.findIndex(key) !== -1;\n }\n\n delete(key: K): void {\n const index = this.findIndex(key);\n if (index !== -1) {\n this.record.splice(index, 1);\n }\n }\n\n private findIndex(key: K): number {\n return this.record.findIndex((entry) => entry.key.equals(key));\n }\n\n clear(): void {\n this.record = [];\n }\n\n forEach(callback: (value: V, key: K) => void): void {\n this.record.forEach((entry) => {\n callback(entry.value, entry.key);\n });\n }\n\n keys(): K[] {\n return this.record.map((entry) => entry.key);\n }\n\n values(): V[] {\n return this.record.map((entry) => entry.value);\n }\n\n entries(): [K, V][] {\n return this.record.map((entry) => [entry.key, entry.value]);\n }\n\n isEmpty(): boolean {\n return this.record.length === 0;\n }\n}\n\n/**\n * Custom map implementation for PublicKey, backed by a hashmap for o(1) lookup speed\n * Calling toString() on a PublicKey is pretty slow and pubkeys do not support `SameValueZero` comparison, so we use a custom map implementation where keys are compared with `PublicKey.equals(PublicKey)`, and a hash is derived from the final 32 bits of the public key\n */\nexport class PubkeyHashMap<K extends PublicKey, V> implements Map<K, V> {\n private buckets: Map<\n number,\n {\n key: K;\n value: V;\n }[]\n >;\n size: number;\n\n constructor(entries?: readonly (readonly [K, V])[] | null) {\n this.buckets = new Map();\n this.size = 0;\n if (entries) {\n for (const [key, value] of entries) {\n this.set(key, value);\n }\n }\n }\n\n *[Symbol.iterator](): IterableIterator<[K, V]> {\n for (const [, bucket] of this.buckets) {\n for (const { key, value } of bucket) {\n yield [key, value];\n }\n }\n }\n\n [Symbol.toStringTag]: string = 'PubkeyHashMap';\n\n set(key: K, value: V): this {\n const hash = new HashablePublicKey(key).hashCode();\n const bucket = this.buckets.get(hash);\n if (!bucket) {\n this.buckets.set(hash, [{ key, value }]);\n this.size++;\n } else {\n const entry = bucket.find((entry) => entry.key.equals(key));\n if (entry) {\n entry.value = value;\n } else {\n bucket.push({ key, value });\n this.size++;\n }\n }\n return this;\n }\n\n get(key: K): V | undefined {\n const hash = new HashablePublicKey(key).hashCode();\n const bucket = this.buckets.get(hash);\n if (!bucket) {\n return undefined;\n }\n const entry = bucket.find((entry) => entry.key.equals(key));\n return entry ? entry.value : undefined;\n }\n\n has(key: K): boolean {\n const hash = new HashablePublicKey(key).hashCode();\n const bucket = this.buckets.get(hash);\n if (!bucket) {\n return false;\n }\n const entry = bucket.find((entry) => entry.key.equals(key));\n return !!entry;\n }\n\n delete(key: K): boolean {\n const hash = new HashablePublicKey(key).hashCode();\n const bucket = this.buckets.get(hash);\n if (!bucket) {\n return false;\n }\n const index = bucket.findIndex((entry) => entry.key.equals(key));\n if (index === -1) {\n return false;\n }\n bucket.splice(index, 1);\n if (bucket.length === 0) {\n this.buckets.delete(hash);\n }\n this.size--;\n return true;\n }\n\n clear(): void {\n this.buckets = new Map();\n this.size = 0;\n }\n\n isEmpty(): boolean {\n return this.size === 0;\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void {\n this.buckets.forEach((bucket) => {\n bucket.forEach((entry) => {\n callbackfn(entry.value, entry.key, this);\n }, thisArg);\n }, thisArg);\n }\n\n *keys(): IterableIterator<K> {\n for (const [key] of this) {\n yield key;\n }\n }\n\n *values(): IterableIterator<V> {\n for (const [, value] of this) {\n yield value;\n }\n }\n\n entries(): IterableIterator<[K, V]> {\n return this[Symbol.iterator]();\n }\n}\n\nexport class HashablePublicKey extends PublicKey implements IEquality<HashablePublicKey> {\n // We only use the last 32 bits of the public key for hashing\n static MASK = new BN(1).shln(32).subn(1);\n constructor(value: PublicKey | string | Buffer | Uint8Array | Array<number>) {\n super(value);\n }\n\n hashCode(): number {\n let hash = 13;\n hash = hash * 7 + this.getBN().clone().iuand(HashablePublicKey.MASK).toNumber();\n return hash;\n }\n\n private getBN(): BN {\n //@ts-ignore\n return this._bn;\n }\n}\n\ninterface IEquality<T extends IEquality<T>> {\n equals(other: T): boolean;\n hashCode(): number;\n}\n"]}
|