@naviprotocol/lending 2.0.5-beta.1 → 2.0.5-dev.0

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.
Files changed (55) hide show
  1. package/dist/account-cap.d.ts +1 -1
  2. package/dist/account-cap.js +26 -0
  3. package/dist/account-cap.js.map +1 -0
  4. package/dist/account.d.ts +2 -2
  5. package/dist/account.js +655 -0
  6. package/dist/account.js.map +1 -0
  7. package/dist/bcs.js +137 -0
  8. package/dist/bcs.js.map +1 -0
  9. package/dist/config.d.ts +1 -1
  10. package/dist/config.js +22 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/emode.d.ts +1 -1
  13. package/dist/emode.js +90 -0
  14. package/dist/emode.js.map +1 -0
  15. package/dist/flashloan.d.ts +1 -1
  16. package/dist/flashloan.js +94 -0
  17. package/dist/flashloan.js.map +1 -0
  18. package/dist/index.d.ts +17 -17
  19. package/dist/index.js +100 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/liquidate.d.ts +1 -1
  22. package/dist/liquidate.js +76 -0
  23. package/dist/liquidate.js.map +1 -0
  24. package/dist/market.d.ts +1 -55
  25. package/dist/market.d.ts.map +1 -1
  26. package/dist/market.js +121 -0
  27. package/dist/market.js.map +1 -0
  28. package/dist/oracle.d.ts +1 -1
  29. package/dist/oracle.js +198 -0
  30. package/dist/oracle.js.map +1 -0
  31. package/dist/package.json.js +8 -0
  32. package/dist/package.json.js.map +1 -0
  33. package/dist/pool.d.ts +1 -1
  34. package/dist/pool.js +391 -0
  35. package/dist/pool.js.map +1 -0
  36. package/dist/pyth.d.ts +1 -1
  37. package/dist/pyth.js +305 -0
  38. package/dist/pyth.js.map +1 -0
  39. package/dist/reward.d.ts +1 -1
  40. package/dist/reward.js +343 -0
  41. package/dist/reward.js.map +1 -0
  42. package/dist/services.js +52 -0
  43. package/dist/services.js.map +1 -0
  44. package/dist/sui.d.ts +1 -1
  45. package/dist/sui.js +121 -0
  46. package/dist/sui.js.map +1 -0
  47. package/dist/types.d.ts +2 -2
  48. package/dist/ua.js +16 -0
  49. package/dist/ua.js.map +1 -0
  50. package/dist/utils.d.ts +2 -2
  51. package/dist/utils.js +227 -0
  52. package/dist/utils.js.map +1 -0
  53. package/package.json +5 -5
  54. package/dist/index.esm.js +0 -2773
  55. package/dist/index.esm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sources":["../src/pool.ts"],"sourcesContent":["/**\n * Lending Pool Operations\n *\n * This module provides comprehensive pool management functionality for the lending protocol.\n * It handles pool information retrieval, deposit/withdraw operations, borrow/repay operations,\n * and various pool-related utilities and statistics.\n *\n * @module LendingPool\n */\n\nimport { DEFAULT_CACHE_TIME, getConfig } from './config'\nimport type {\n EnvOption,\n CacheOption,\n Pool,\n AssetIdentifier,\n PoolStats,\n FeeDetail,\n CoinObject,\n TransactionResult,\n SingleCoinTransactionResult,\n AccountCapOption,\n BorrowFeeOption,\n SuiClientOption,\n MarketOption,\n EMode,\n MarketsOption,\n ServiceOption\n} from './types'\nimport {\n normalizeCoinType,\n withCache,\n withSingleton,\n parseTxValue,\n requestHeaders,\n parsePoolUID,\n parseDevInspectResult,\n devInspectTransaction,\n getSuiObject,\n suiClient\n} from './utils'\nimport { buildNaviOpenApiUrl, mergeServiceHeaders, resolveNaviOpenApiEndpoint } from './services'\nimport { Transaction } from '@mysten/sui/transactions'\nimport BigNumber from 'bignumber.js'\nimport { bcs } from '@mysten/sui/bcs'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Enumeration of pool operations\n *\n * This enum defines the different types of operations that can be performed\n * on lending pools, used for health factor calculations and operation tracking.\n */\nexport enum PoolOperator {\n /** Supply/deposit operation */\n Supply = 1,\n /** Withdraw operation */\n Withdraw = 2,\n /** Borrow operation */\n Borrow = 3,\n /** Repay operation */\n Repay = 4\n}\n\n/**\n * Fetches all available lending pools\n *\n * This function retrieves the complete list of lending pools from the Navi protocol API.\n * It's wrapped with caching and singleton behavior for efficient data access.\n *\n * @param options - Optional environment and caching options\n * @returns Promise<Pool[]> - Array of all available lending pools\n */\nexport const getPools = withCache(\n withSingleton(\n async (\n options?: Partial<EnvOption & CacheOption & MarketsOption & ServiceOption>\n ): Promise<Pool[]> => {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n const endpoint = resolveNaviOpenApiEndpoint(options)\n const url = buildNaviOpenApiUrl(\n `/navi/pools?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${markets.map(\n (market) => {\n return market.key\n }\n )}`,\n options\n )\n const res: {\n data: Pool[]\n meta: {\n emodes: EMode[]\n }\n } = await fetch(url, { headers: mergeServiceHeaders(requestHeaders, endpoint) }).then((res) =>\n res.json()\n )\n\n res.data.forEach((pool) => {\n const filterEmodes = res.meta.emodes.filter((emode) => {\n const market = getMarketConfig(emode.marketId)\n return pool.market === market.key && emode.isActive\n })\n const emodes = filterEmodes.filter((emode) => {\n return !!emode.assets.find((asset) => asset.assetId === pool.id)\n })\n pool.emodes = emodes\n const poolSupplyAmount = BigNumber(pool.totalSupplyAmount)\n .div(Math.pow(10, 9))\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowAmount = BigNumber(pool.borrowedAmount)\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyValue = BigNumber(poolSupplyAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowValue = BigNumber(poolBorrowAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolSupplyCapAmount = BigNumber(pool.supplyCapCeiling)\n .shiftedBy(-27)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowCapAmount = BigNumber.max(\n BigNumber(pool.borrowedAmount),\n BigNumber(pool.validBorrowAmount)\n )\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyCapValue = BigNumber(poolSupplyCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowCapValue = BigNumber(poolBorrowCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n pool.poolSupplyAmount = poolSupplyAmount\n pool.poolBorrowAmount = poolBorrowAmount\n pool.poolSupplyValue = poolSupplyValue\n pool.poolBorrowValue = poolBorrowValue\n pool.poolSupplyCapAmount = poolSupplyCapAmount\n pool.poolBorrowCapAmount = poolBorrowCapAmount\n pool.poolSupplyCapValue = poolSupplyCapValue\n pool.poolBorrowCapValue = poolBorrowCapValue\n })\n return res.data\n }\n )\n)\n\n/**\n * Gets information for a specific lending pool\n *\n * This function retrieves pool information based on various identifier types:\n * - Pool object (returns directly)\n * - String (coin type - normalized for comparison)\n * - Number (pool ID)\n *\n * @param identifier - Asset identifier (string, Pool object, or number)\n * @param options - Optional environment options\n * @returns Promise<Pool> - Pool information\n * @throws Error if pool is not found\n */\nexport async function getPool(\n identifier: AssetIdentifier,\n options?: Partial<EnvOption & MarketOption & ServiceOption>\n): Promise<Pool> {\n let market = options?.market\n if (typeof identifier === 'string') {\n const parsedUID = parsePoolUID(identifier)\n if (parsedUID) {\n market = parsedUID.marketKey\n identifier = parsedUID.poolId\n }\n }\n const pools = await getPools({\n ...options,\n markets: [market || DEFAULT_MARKET_IDENTITY],\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // If identifier is already a pool object, return it directly\n if (typeof identifier === 'object') {\n return identifier\n }\n\n // Find pool by identifier\n const pool = pools.find((p) => {\n if (typeof identifier === 'string') {\n return normalizeCoinType(p.suiCoinType) === normalizeCoinType(identifier)\n }\n if (typeof identifier === 'number') {\n return p.id === identifier\n }\n return false\n })\n\n if (!pool) {\n throw new Error(`Pool not found`)\n }\n\n if (pool.isDeprecated) {\n console.log(`The lending pool for coinType ${pool.suiCoinType} is going to be deprecated.`)\n }\n return pool\n}\n\n/**\n * Fetches protocol statistics\n *\n * This function retrieves overall protocol statistics including TVL,\n * total borrow amounts, and other key metrics.\n *\n * @param options - Optional caching options\n * @returns Promise<PoolStats> - Protocol statistics\n */\nexport const getStats = withCache(\n withSingleton(async (options?: Partial<CacheOption & ServiceOption>): Promise<PoolStats> => {\n const endpoint = resolveNaviOpenApiEndpoint(options)\n const url = buildNaviOpenApiUrl(`/navi/stats?sdk=${packageJson.version}`, options)\n const res = await fetch(url, {\n headers: mergeServiceHeaders(requestHeaders, endpoint)\n }).then((res) => res.json())\n return res.data\n })\n)\n\n/**\n * Fetches protocol fee information\n *\n * This function retrieves detailed fee information including:\n * - Total fee value\n * - V3 borrow fees\n * - Borrow interest fees\n * - Flash loan and liquidation fees\n *\n * @param options - Optional caching options\n * @returns Promise with detailed fee breakdown\n */\nexport const getFees = withCache(\n withSingleton(\n async (\n options?: Partial<CacheOption & ServiceOption>\n ): Promise<{\n totalValue: number\n v3BorrowFee: {\n totalValue: number\n details: FeeDetail[]\n }\n borrowInterestFee: {\n totalValue: number\n details: FeeDetail[]\n }\n flashloanAndLiquidationFee: {\n totalValue: number\n details: FeeDetail[]\n }\n }> => {\n const endpoint = resolveNaviOpenApiEndpoint(options)\n const url = buildNaviOpenApiUrl(`/navi/fee?sdk=${packageJson.version}`, options)\n const res = await fetch(url, {\n headers: mergeServiceHeaders(requestHeaders, endpoint)\n }).then((res) => res.json())\n return res\n }\n )\n)\n\n/**\n * Builds a deposit transaction for a lending pool\n *\n * This function creates a transaction block for depositing coins into a lending pool.\n * It handles both regular deposits and deposits with account capabilities,\n * and includes special handling for SUI gas coins.\n *\n * @param tx - Transaction object to build\n * @param identifier - Asset identifier for the pool\n * @param coinObject - Coin object to deposit\n * @param options - Optional parameters including environment, account capability, and amount\n * @returns Promise<Transaction> - Transaction with deposit operation\n */\nexport async function depositCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n ServiceOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n const market = options?.market || DEFAULT_MARKET_IDENTITY\n const env = options?.env || 'prod'\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n // Handle SUI gas coin deposits\n if (\n normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') &&\n typeof coinObject === 'object' &&\n coinObject?.$kind === 'GasCoin'\n ) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n // Determine deposit amount\n let depositAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n depositAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n depositAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // Build deposit transaction based on account capability\n if (options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::incentive_v3::deposit_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n depositAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // refresh stake for sui pool to balance the stake after deposit\n if (config.version === 2 && pool.token.symbol === 'SUI' && env === 'prod' && market === 'main') {\n tx.moveCall({\n target: `${config.package}::pool::refresh_stake`,\n arguments: [tx.object(pool.contract.pool), tx.object('0x05')]\n })\n }\n\n return tx\n}\n\n/**\n * Builds a withdraw transaction for a lending pool\n *\n * Constructs and adds withdrawal operations to a transaction object.\n * This function supports standard withdrawal and withdrawal using account capability.\n *\n * @param tx - The transaction builder to append operations to\n * @param identifier - Asset identifier for the pool\n * @param amount - Amount to withdraw\n * @param options - Optional parameters including environment and account capability\n * @returns Transaction result representing the withdrawn coins\n */\nexport async function withdrawCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption & ServiceOption>\n): Promise<SingleCoinTransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n const withdrawAmount = parseTxValue(amount, tx.pure.u64)\n\n let withdrawBalance\n\n if (config.version === 1) {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n } else {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n }\n\n const withdrawCoin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [withdrawBalance],\n typeArguments: [pool.suiCoinType]\n })\n\n return withdrawCoin as SingleCoinTransactionResult\n}\n\nexport async function borrowCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption & ServiceOption>\n): Promise<SingleCoinTransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const borrowAmount = parseTxValue(amount, tx.pure.u64)\n\n let borrowBalance\n\n if (config.version === 1) {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n } else {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n }\n\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [tx.object(borrowBalance)],\n typeArguments: [pool.suiCoinType]\n })\n\n return coin as SingleCoinTransactionResult\n}\n\n/**\n * Builds a repay transaction for a lending pool debt\n *\n * Constructs and adds repayment operations to an existing transaction object.\n * This function handles loan repayments, supporting both standard user\n * repayments and privileged operations via account capabilities.\n *\n *\n * @param tx - The transaction builder to append repayment operations to\n * @param identifier - Unique identifier for the lending pool asset (e.g., \"USDC\", \"SUI\")\n * @param coinObject - The coin object to use for repayment, or GasCoin for SUI payments\n * @param options - Configuration options for the repayment\n * - `amount` - Specific amount to repay (required for SUI gas coin, otherwise uses value of specified coinObject)\n * - `accountCap` - Optional account capability object for privileged repayments\n * - `env` - Environment configuration\n * - `cacheTime` - Cache duration for configuration data\n *\n * @returns Promise<Transaction | TransactionResult> - The modified transaction object with repayment operations added\n *\n * @throws {Error} When amount is not provided for SUI gas coin repayments\n * @throws Will throw if pool doesn't exist or repayment validation fails\n */\nexport async function repayCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n ServiceOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction | TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n if (\n normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') &&\n typeof coinObject === 'object' &&\n coinObject?.$kind === 'GasCoin'\n ) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n let repayAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n repayAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n repayAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::repay_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [ret],\n typeArguments: [pool.suiCoinType]\n })\n return coin\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n repayAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n return tx\n }\n}\n\n/**\n * Fetches the current borrow fee rate\n *\n * This function can retrieve borrow fee rates in two ways:\n * - If `address` and `asset` are provided, it calculates the specific borrow fee rate\n * for a given address and asset by calling the on-chain `get_borrow_fee_v2` function\n * - Otherwise, it returns the global borrow fee rate from the incentive V3 contract\n *\n * @param options - Optional configuration options\n * - `address` - User address to calculate specific borrow fee (requires `asset` to be set)\n * - `asset` - Asset identifier to calculate specific borrow fee (requires `address` to be set)\n * - `env` - Environment setting ('dev' or 'prod')\n * - `client` - Sui client instance for on-chain queries\n * - `cacheTime` - Cache expiration time in milliseconds\n * - `disableCache` - Whether to disable caching for this operation\n * @returns Promise<number> - Borrow fee rate as a decimal number\n * - When `address` and `asset` are provided: returns the specific fee rate (divided by 10000)\n * - Otherwise: returns the global fee rate (divided by 100)\n */\nexport const getBorrowFee = withCache(\n withSingleton(\n async (\n options?: Partial<EnvOption & CacheOption & BorrowFeeOption & SuiClientOption & MarketOption>\n ): Promise<number> => {\n const config = await getConfig({\n ...options\n })\n const client = options?.client ?? suiClient\n if (options?.address && typeof options?.asset !== 'undefined') {\n try {\n const pool = await getPool(options.asset, options)\n const tx = new Transaction()\n tx.moveCall({\n target: `${config.package}::incentive_v3::get_borrow_fee_v2`,\n arguments: [\n tx.object(config.incentiveV3),\n tx.pure.address(options.address),\n tx.pure.u8(pool.id),\n tx.pure.u64(10000)\n ],\n typeArguments: []\n })\n const result = await devInspectTransaction(client, {\n transactionBlock: tx,\n sender: options.address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u64()])\n return (Number(res[0]) || 0) / 100\n } catch (error) {\n // Per-user borrow-fee query failed -> fall back to the global rate below\n // (semantic change; marked explicitly for traceability, fallback behavior unchanged).\n console.error(\n '[lending] getBorrowFee per-user query failed, falling back to global rate:',\n error\n )\n }\n }\n const rawData: any = await getSuiObject(client, {\n id: config.incentiveV3,\n options: { showType: true, showOwner: true, showContent: true }\n })\n const borrowFee = rawData.data.content.fields.borrow_fee_rate\n return Number(borrowFee) / 100\n }\n )\n)\n"],"names":["PoolOperator","getPools","withCache","withSingleton","options","markets","MARKETS","identity","getMarketConfig","endpoint","resolveNaviOpenApiEndpoint","url","buildNaviOpenApiUrl","packageJson","market","res","mergeServiceHeaders","requestHeaders","pool","emodes","emode","asset","poolSupplyAmount","BigNumber","poolBorrowAmount","poolSupplyValue","poolBorrowValue","poolSupplyCapAmount","poolBorrowCapAmount","poolSupplyCapValue","poolBorrowCapValue","getPool","identifier","parsedUID","parsePoolUID","pools","DEFAULT_MARKET_IDENTITY","DEFAULT_CACHE_TIME","p","normalizeCoinType","getStats","getFees","depositCoinPTB","tx","coinObject","config","getConfig","env","depositAmount","parseTxValue","withdrawCoinPTB","amount","withdrawAmount","withdrawBalance","ret","borrowCoinPTB","borrowAmount","borrowBalance","repayCoinPTB","repayAmount","getBorrowFee","client","suiClient","Transaction","result","devInspectTransaction","parseDevInspectResult","bcs","error","borrowFee","getSuiObject"],"mappings":"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"}
package/dist/pyth.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { NaviSuiClient } from './sui';
1
+ import { NaviSuiClient } from './sui.js';
2
2
  import { Transaction } from '@mysten/sui/transactions';
3
3
 
4
4
  type PriceFeed = {
package/dist/pyth.js ADDED
@@ -0,0 +1,305 @@
1
+ import { bcs as d } from "@mysten/sui/bcs";
2
+ import { SUI_CLOCK_OBJECT_ID as p } from "@mysten/sui/utils";
3
+ const b = 16 * 1024;
4
+ function u(a) {
5
+ return a.replace(/^0x/i, "");
6
+ }
7
+ function h(a) {
8
+ const e = u(a), t = new Uint8Array(e.length / 2);
9
+ for (let r = 0; r < t.length; r += 1)
10
+ t[r] = parseInt(e.slice(r * 2, r * 2 + 2), 16);
11
+ return t;
12
+ }
13
+ function g(a, e) {
14
+ return (a[e] << 8) + a[e + 1];
15
+ }
16
+ function f(a) {
17
+ return d.vector(d.U8).serialize(Array.from(a), {
18
+ maxSize: b
19
+ });
20
+ }
21
+ function y(a, e) {
22
+ return {
23
+ type: a,
24
+ bcs: e
25
+ };
26
+ }
27
+ function m(a) {
28
+ return d.vector(d.U8).serialize(Array.from(new TextEncoder().encode(a))).toBytes();
29
+ }
30
+ function I(a) {
31
+ return d.struct("PriceIdentifier", {
32
+ bytes: d.vector(d.U8)
33
+ }).serialize({
34
+ bytes: Array.from(a)
35
+ }).toBytes();
36
+ }
37
+ function j(a) {
38
+ const e = [];
39
+ let t = 0, r = 0;
40
+ for (let i = 0; i < a.length; i += 1) {
41
+ const o = a[i];
42
+ o === "<" ? t += 1 : o === ">" ? t -= 1 : o === "," && t === 0 && (e.push(a.slice(r, i).trim()), r = i + 1);
43
+ }
44
+ return e.push(a.slice(r).trim()), e;
45
+ }
46
+ function w(a) {
47
+ const t = a.indexOf("::table::Table"), r = a.indexOf("<", t), i = a.lastIndexOf(">"), o = "::price_identifier::PriceIdentifier";
48
+ if (t < 0 || r < 0 || i <= r)
49
+ throw new Error(`Unexpected Pyth price table type: ${a}`);
50
+ const [c, n] = j(a.slice(r + 1, i));
51
+ if (!c?.endsWith(o) || !n?.endsWith("::object::ID"))
52
+ throw new Error(`Unexpected Pyth price table type arguments: ${a}`);
53
+ return c.slice(0, -o.length);
54
+ }
55
+ function v(a) {
56
+ return Uint8Array.from(atob(a), (e) => e.charCodeAt(0));
57
+ }
58
+ class F {
59
+ constructor(e, t) {
60
+ this.endpoint = e.replace(/\/$/, ""), this.timeout = t?.timeout ?? 1e4;
61
+ }
62
+ async getLatestPriceFeeds(e) {
63
+ return (await this.get("/api/latest_price_feeds", e)).map((r) => ({
64
+ id: r.id,
65
+ getPriceUnchecked: () => ({
66
+ price: r.price.price,
67
+ conf: r.price.conf,
68
+ expo: r.price.expo,
69
+ publishTime: r.price.publish_time
70
+ })
71
+ }));
72
+ }
73
+ async getPriceFeedsUpdateData(e) {
74
+ const t = await this.get(
75
+ "/v2/updates/price/latest",
76
+ e,
77
+ {
78
+ encoding: "base64",
79
+ parsed: "false"
80
+ }
81
+ ), r = t.binary?.encoding, i = t.binary?.data ?? [];
82
+ if (r && r !== "base64")
83
+ throw new Error(`Unsupported Hermes price update encoding: ${r}`);
84
+ if (i.length === 0)
85
+ throw new Error("Hermes price update response did not include binary update data");
86
+ return i.map(v);
87
+ }
88
+ async get(e, t, r) {
89
+ const i = new AbortController(), o = setTimeout(() => i.abort(), this.timeout), c = new URL(`${this.endpoint}${e}`);
90
+ for (const [n, s] of Object.entries(r ?? {}))
91
+ c.searchParams.set(n, s);
92
+ for (const n of t)
93
+ c.searchParams.append("ids[]", u(n));
94
+ try {
95
+ const n = await fetch(c, {
96
+ signal: i.signal
97
+ });
98
+ if (!n.ok)
99
+ throw new Error(`Hermes request failed: ${n.status} ${n.statusText}`);
100
+ return await n.json();
101
+ } finally {
102
+ clearTimeout(o);
103
+ }
104
+ }
105
+ }
106
+ class _ {
107
+ constructor(e, t, r) {
108
+ this.provider = e, this.pythStateId = t, this.wormholeStateId = r, this.priceFeedObjectIdCache = /* @__PURE__ */ new Map();
109
+ }
110
+ getCoreProvider() {
111
+ const e = this.provider.core;
112
+ return e && typeof e.getObject == "function" && typeof e.getDynamicObjectField == "function" && typeof e.getDynamicField == "function" ? e : null;
113
+ }
114
+ async getMoveObjectJson(e) {
115
+ const t = this.getCoreProvider();
116
+ if (t) {
117
+ const i = await t.getObject({
118
+ objectId: e,
119
+ include: { json: !0 }
120
+ });
121
+ return i.object ? {
122
+ objectId: i.object.objectId,
123
+ type: i.object.type,
124
+ fields: i.object.json
125
+ } : null;
126
+ }
127
+ if (!this.provider.getObject)
128
+ throw new Error("Sui Pyth provider does not support getObject");
129
+ const r = await this.provider.getObject({
130
+ id: e,
131
+ options: { showContent: !0 }
132
+ });
133
+ return !r.data || !r.data.content || r.data.content.dataType !== "moveObject" ? null : {
134
+ objectId: r.data.objectId,
135
+ type: r.data.type,
136
+ fields: r.data.content.fields
137
+ };
138
+ }
139
+ async getDynamicMoveObjectJson(e, t) {
140
+ const r = this.getCoreProvider();
141
+ if (r) {
142
+ const o = await r.getDynamicObjectField({
143
+ parentId: e,
144
+ name: t,
145
+ include: { json: !0 }
146
+ });
147
+ return o.object ? {
148
+ objectId: o.object.objectId,
149
+ type: o.object.type,
150
+ fields: o.object.json
151
+ } : null;
152
+ }
153
+ if (!this.provider.getDynamicFieldObject)
154
+ throw new Error("Sui Pyth provider does not support getDynamicFieldObject");
155
+ const i = await this.provider.getDynamicFieldObject({
156
+ parentId: e,
157
+ name: t
158
+ });
159
+ return i.data ? i.data.content ? i.data.content.dataType !== "moveObject" ? null : {
160
+ objectId: i.data.objectId,
161
+ type: i.data.type,
162
+ fields: i.data.content.fields
163
+ } : {
164
+ objectId: i.data.objectId,
165
+ type: i.data.type,
166
+ fields: void 0
167
+ } : null;
168
+ }
169
+ async updatePriceFeeds(e, t, r) {
170
+ const i = await this.getPythPackageId(), o = await this.verifyVaasAndGetHotPotato(e, t, i), c = await this.getBaseUpdateFee(), n = e.splitCoins(
171
+ e.gas,
172
+ r.map(() => e.pure.u64(c))
173
+ );
174
+ return this.executePriceFeedUpdates(e, i, r, o, n);
175
+ }
176
+ async getBaseUpdateFee() {
177
+ if (this.baseUpdateFee === void 0) {
178
+ const e = await this.getMoveObjectJson(this.pythStateId);
179
+ if (!e?.fields)
180
+ throw new Error("Unable to fetch pyth state object");
181
+ this.baseUpdateFee = Number(e.fields.base_update_fee);
182
+ }
183
+ return this.baseUpdateFee;
184
+ }
185
+ async getPackageId(e) {
186
+ const t = await this.getMoveObjectJson(e);
187
+ if (t?.fields) {
188
+ const r = t.fields;
189
+ if ("upgrade_cap" in r) {
190
+ const i = r.upgrade_cap, o = i?.package ?? i?.fields?.package;
191
+ if (o)
192
+ return o;
193
+ }
194
+ }
195
+ throw new Error(`Cannot fetch package id for object ${e}`);
196
+ }
197
+ async verifyVaas(e, t) {
198
+ const r = await this.getWormholePackageId();
199
+ return e.map((i) => {
200
+ const [o] = t.moveCall({
201
+ target: `${r}::vaa::parse_and_verify`,
202
+ arguments: [
203
+ t.object(this.wormholeStateId),
204
+ t.pure(f(i)),
205
+ t.object(p)
206
+ ]
207
+ });
208
+ return o;
209
+ });
210
+ }
211
+ async verifyVaasAndGetHotPotato(e, t, r) {
212
+ if (t.length > 1)
213
+ throw new Error(
214
+ "SDK does not support sending multiple accumulator messages in a single transaction"
215
+ );
216
+ const i = this.extractVaaBytesFromAccumulatorMessage(t[0]), [o] = await this.verifyVaas([i], e), [c] = e.moveCall({
217
+ target: `${r}::pyth::create_authenticated_price_infos_using_accumulator`,
218
+ arguments: [
219
+ e.object(this.pythStateId),
220
+ e.pure(f(t[0])),
221
+ o,
222
+ e.object(p)
223
+ ]
224
+ });
225
+ return c;
226
+ }
227
+ async executePriceFeedUpdates(e, t, r, i, o) {
228
+ const c = [];
229
+ for (const [n, s] of r.entries()) {
230
+ const l = await this.getPriceFeedObjectId(s);
231
+ if (!l)
232
+ throw new Error(`Price feed ${s} not found, please create it first`);
233
+ c.push(l), [i] = e.moveCall({
234
+ target: `${t}::pyth::update_single_price_feed`,
235
+ arguments: [
236
+ e.object(this.pythStateId),
237
+ i,
238
+ e.object(l),
239
+ o[n],
240
+ e.object(p)
241
+ ]
242
+ });
243
+ }
244
+ return e.moveCall({
245
+ target: `${t}::hot_potato_vector::destroy`,
246
+ arguments: [i],
247
+ typeArguments: [`${t}::price_info::PriceInfo`]
248
+ }), c;
249
+ }
250
+ async getWormholePackageId() {
251
+ return this.wormholePackageId || (this.wormholePackageId = await this.getPackageId(this.wormholeStateId)), this.wormholePackageId;
252
+ }
253
+ async getPythPackageId() {
254
+ return this.pythPackageId || (this.pythPackageId = await this.getPackageId(this.pythStateId)), this.pythPackageId;
255
+ }
256
+ async getPriceFeedObjectId(e) {
257
+ const t = u(e);
258
+ if (!this.priceFeedObjectIdCache.has(t)) {
259
+ const { id: r, fieldType: i } = await this.getPriceTableInfo(), o = `${i}::price_identifier::PriceIdentifier`, c = this.getCoreProvider();
260
+ if (c) {
261
+ const { dynamicField: n } = await c.getDynamicField({
262
+ parentId: r,
263
+ name: y(o, I(h(t)))
264
+ }), s = n?.value?.bcs;
265
+ this.priceFeedObjectIdCache.set(
266
+ t,
267
+ s && s.length === 32 ? d.Address.parse(Uint8Array.from(s)) : void 0
268
+ );
269
+ } else {
270
+ const n = await this.getDynamicMoveObjectJson(r, {
271
+ type: o,
272
+ value: {
273
+ bytes: Array.from(h(t))
274
+ }
275
+ });
276
+ n?.fields ? this.priceFeedObjectIdCache.set(t, n.fields.value) : this.priceFeedObjectIdCache.set(t, void 0);
277
+ }
278
+ }
279
+ return this.priceFeedObjectIdCache.get(t);
280
+ }
281
+ async getPriceTableInfo() {
282
+ if (!this.priceTableInfo) {
283
+ const e = this.getCoreProvider() ? y("vector<u8>", m("price_info")) : {
284
+ type: "vector<u8>",
285
+ value: "price_info"
286
+ }, t = await this.getDynamicMoveObjectJson(this.pythStateId, e);
287
+ if (!t?.type)
288
+ throw new Error("Price Table not found, contract may not be initialized");
289
+ this.priceTableInfo = {
290
+ id: t.objectId,
291
+ fieldType: w(t.type)
292
+ };
293
+ }
294
+ return this.priceTableInfo;
295
+ }
296
+ extractVaaBytesFromAccumulatorMessage(e) {
297
+ const r = 7 + e[6] + 1, i = g(e, r), o = r + 2;
298
+ return e.subarray(o, o + i);
299
+ }
300
+ }
301
+ export {
302
+ F as SuiPriceServiceConnection,
303
+ _ as SuiPythClient
304
+ };
305
+ //# sourceMappingURL=pyth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyth.js","sources":["../src/pyth.ts"],"sourcesContent":["import type { NaviSuiClient } from './sui'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { bcs } from '@mysten/sui/bcs'\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils'\n\ntype HermesPrice = {\n price: string\n conf: string\n expo: number\n publish_time: number\n}\n\ntype HermesPriceFeedResponse = {\n id: string\n price: HermesPrice\n}\n\ntype HermesPriceUpdateResponse = {\n binary?: {\n encoding?: string\n data?: string[]\n }\n}\n\ntype PriceFeed = {\n id: string\n getPriceUnchecked(): {\n price: string\n conf: string\n expo: number\n publishTime: number\n }\n}\n\ntype CoreDynamicFieldName = {\n type: string\n bcs: Uint8Array\n}\n\ntype SuiPythProvider = Partial<Pick<NaviSuiClient, 'getObject' | 'getDynamicFieldObject'>> & {\n core?: unknown\n}\n\ntype SuiPythCoreProvider = {\n getObject(options: {\n objectId: string\n include?: { json?: boolean; content?: boolean }\n }): Promise<{\n object?: { objectId: string; type?: string; json?: Record<string, unknown> | null }\n }>\n getDynamicObjectField(options: {\n parentId: string\n name: CoreDynamicFieldName\n include?: { json?: boolean; content?: boolean }\n }): Promise<{\n object?: { objectId: string; type?: string; json?: Record<string, unknown> | null }\n }>\n getDynamicField(options: { parentId: string; name: CoreDynamicFieldName }): Promise<{\n dynamicField?: { value?: { type?: string; bcs?: Uint8Array } }\n }>\n}\n\nconst MAX_ARGUMENT_SIZE = 16 * 1024\n\nfunction normalizePriceId(priceId: string) {\n return priceId.replace(/^0x/i, '')\n}\n\nfunction hexToBytes(hex: string) {\n const normalized = normalizePriceId(hex)\n const bytes = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < bytes.length; i += 1) {\n bytes[i] = parseInt(normalized.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n\nfunction readUint16BE(bytes: Uint8Array, offset: number) {\n return (bytes[offset] << 8) + bytes[offset + 1]\n}\n\nfunction toPureBytes(bytes: Uint8Array) {\n return bcs.vector(bcs.U8).serialize(Array.from(bytes), {\n maxSize: MAX_ARGUMENT_SIZE\n })\n}\n\nfunction toDynamicFieldName(type: string, bytes: Uint8Array): CoreDynamicFieldName {\n return {\n type,\n bcs: bytes\n }\n}\n\nfunction encodeVectorU8(value: string) {\n return bcs\n .vector(bcs.U8)\n .serialize(Array.from(new TextEncoder().encode(value)))\n .toBytes()\n}\n\nfunction encodePriceIdentifier(bytes: Uint8Array) {\n return bcs\n .struct('PriceIdentifier', {\n bytes: bcs.vector(bcs.U8)\n })\n .serialize({\n bytes: Array.from(bytes)\n })\n .toBytes()\n}\n\nfunction splitTopLevelTypeArgs(args: string) {\n const parts: string[] = []\n let depth = 0\n let start = 0\n\n for (let index = 0; index < args.length; index += 1) {\n const char = args[index]\n if (char === '<') {\n depth += 1\n } else if (char === '>') {\n depth -= 1\n } else if (char === ',' && depth === 0) {\n parts.push(args.slice(start, index).trim())\n start = index + 1\n }\n }\n\n parts.push(args.slice(start).trim())\n return parts\n}\n\nfunction getPythPackageIdFromPriceTableType(type: string) {\n const tablePrefix = '::table::Table'\n const tableIndex = type.indexOf(tablePrefix)\n const argsStart = type.indexOf('<', tableIndex)\n const argsEnd = type.lastIndexOf('>')\n const priceIdentifierSuffix = '::price_identifier::PriceIdentifier'\n\n if (tableIndex < 0 || argsStart < 0 || argsEnd <= argsStart) {\n throw new Error(`Unexpected Pyth price table type: ${type}`)\n }\n\n const [keyType, valueType] = splitTopLevelTypeArgs(type.slice(argsStart + 1, argsEnd))\n if (!keyType?.endsWith(priceIdentifierSuffix) || !valueType?.endsWith('::object::ID')) {\n throw new Error(`Unexpected Pyth price table type arguments: ${type}`)\n }\n\n return keyType.slice(0, -priceIdentifierSuffix.length)\n}\n\nfunction base64ToBytes(value: string) {\n return Uint8Array.from(atob(value), (char) => char.charCodeAt(0))\n}\n\nexport class SuiPriceServiceConnection {\n private readonly endpoint: string\n private readonly timeout: number\n\n constructor(endpoint: string, options?: { timeout?: number }) {\n this.endpoint = endpoint.replace(/\\/$/, '')\n this.timeout = options?.timeout ?? 10000\n }\n\n async getLatestPriceFeeds(priceIds: string[]): Promise<PriceFeed[] | undefined> {\n const data = await this.get<HermesPriceFeedResponse[]>('/api/latest_price_feeds', priceIds)\n return data.map((feed) => ({\n id: feed.id,\n getPriceUnchecked: () => ({\n price: feed.price.price,\n conf: feed.price.conf,\n expo: feed.price.expo,\n publishTime: feed.price.publish_time\n })\n }))\n }\n\n async getPriceFeedsUpdateData(priceIds: string[]): Promise<Uint8Array[]> {\n const response = await this.get<HermesPriceUpdateResponse>(\n '/v2/updates/price/latest',\n priceIds,\n {\n encoding: 'base64',\n parsed: 'false'\n }\n )\n const encoding = response.binary?.encoding\n const data = response.binary?.data ?? []\n\n if (encoding && encoding !== 'base64') {\n throw new Error(`Unsupported Hermes price update encoding: ${encoding}`)\n }\n\n if (data.length === 0) {\n throw new Error('Hermes price update response did not include binary update data')\n }\n\n return data.map(base64ToBytes)\n }\n\n private async get<T>(\n pathname: string,\n priceIds: string[],\n searchParams?: Record<string, string>\n ): Promise<T> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.timeout)\n const url = new URL(`${this.endpoint}${pathname}`)\n\n for (const [key, value] of Object.entries(searchParams ?? {})) {\n url.searchParams.set(key, value)\n }\n\n for (const priceId of priceIds) {\n url.searchParams.append('ids[]', normalizePriceId(priceId))\n }\n\n try {\n const res = await fetch(url, {\n signal: controller.signal\n })\n if (!res.ok) {\n throw new Error(`Hermes request failed: ${res.status} ${res.statusText}`)\n }\n return (await res.json()) as T\n } finally {\n clearTimeout(timeout)\n }\n }\n}\n\nexport class SuiPythClient {\n private pythPackageId?: string\n private wormholePackageId?: string\n private priceTableInfo?: {\n id: string\n fieldType: string\n }\n private readonly priceFeedObjectIdCache = new Map<string, string | undefined>()\n private baseUpdateFee?: number\n\n constructor(\n private readonly provider: SuiPythProvider,\n private readonly pythStateId: string,\n private readonly wormholeStateId: string\n ) {}\n\n private getCoreProvider(): SuiPythCoreProvider | null {\n const core = this.provider.core as Partial<SuiPythCoreProvider> | undefined\n if (\n core &&\n typeof core.getObject === 'function' &&\n typeof core.getDynamicObjectField === 'function' &&\n typeof core.getDynamicField === 'function'\n ) {\n return core as SuiPythCoreProvider\n }\n return null\n }\n\n private async getMoveObjectJson(objectId: string) {\n const core = this.getCoreProvider()\n if (core) {\n const result = await core.getObject({\n objectId,\n include: { json: true }\n })\n if (!result.object) {\n return null\n }\n return {\n objectId: result.object.objectId,\n type: result.object.type,\n fields: result.object.json\n }\n }\n\n if (!this.provider.getObject) {\n throw new Error('Sui Pyth provider does not support getObject')\n }\n const result = await this.provider.getObject({\n id: objectId,\n options: { showContent: true }\n })\n if (!result.data || !result.data.content || result.data.content.dataType !== 'moveObject') {\n return null\n }\n return {\n objectId: result.data.objectId,\n type: result.data.type,\n fields: result.data.content.fields as Record<string, unknown>\n }\n }\n\n private async getDynamicMoveObjectJson(parentId: string, name: CoreDynamicFieldName | any) {\n const core = this.getCoreProvider()\n if (core) {\n const result = await core.getDynamicObjectField({\n parentId,\n name,\n include: { json: true }\n })\n if (!result.object) {\n return null\n }\n return {\n objectId: result.object.objectId,\n type: result.object.type,\n fields: result.object.json\n }\n }\n\n if (!this.provider.getDynamicFieldObject) {\n throw new Error('Sui Pyth provider does not support getDynamicFieldObject')\n }\n const result = await this.provider.getDynamicFieldObject({\n parentId,\n name\n })\n if (!result.data) {\n return null\n }\n if (!result.data.content) {\n return {\n objectId: result.data.objectId,\n type: result.data.type,\n fields: undefined\n }\n }\n if (result.data.content.dataType !== 'moveObject') {\n return null\n }\n return {\n objectId: result.data.objectId,\n type: result.data.type,\n fields: result.data.content.fields as Record<string, unknown>\n }\n }\n\n async updatePriceFeeds(tx: Transaction, updates: Uint8Array[], feedIds: string[]) {\n const packageId = await this.getPythPackageId()\n const priceUpdatesHotPotato = await this.verifyVaasAndGetHotPotato(tx, updates, packageId)\n const baseUpdateFee = await this.getBaseUpdateFee()\n const coins = tx.splitCoins(\n tx.gas,\n feedIds.map(() => tx.pure.u64(baseUpdateFee))\n )\n return this.executePriceFeedUpdates(tx, packageId, feedIds, priceUpdatesHotPotato, coins)\n }\n\n private async getBaseUpdateFee() {\n if (this.baseUpdateFee === undefined) {\n const result = await this.getMoveObjectJson(this.pythStateId)\n if (!result?.fields) {\n throw new Error('Unable to fetch pyth state object')\n }\n this.baseUpdateFee = Number((result.fields as any).base_update_fee)\n }\n return this.baseUpdateFee\n }\n\n private async getPackageId(objectId: string) {\n const result = await this.getMoveObjectJson(objectId)\n if (result?.fields) {\n const fields = result.fields as any\n if ('upgrade_cap' in fields) {\n // Sui v2 Core (gRPC) returns flat json (upgrade_cap.package) while legacy\n // JSON-RPC nests it (upgrade_cap.fields.package). Support both; otherwise\n // the Core path cannot resolve the packageId and getPythPackageId /\n // getWormholePackageId throw, breaking Pyth price feed updates entirely.\n const upgradeCap = fields.upgrade_cap\n const packageId = upgradeCap?.package ?? upgradeCap?.fields?.package\n if (packageId) {\n return packageId as string\n }\n }\n }\n throw new Error(`Cannot fetch package id for object ${objectId}`)\n }\n\n private async verifyVaas(vaas: Uint8Array[], tx: Transaction) {\n const wormholePackageId = await this.getWormholePackageId()\n return vaas.map((vaa) => {\n const [verifiedVaa] = tx.moveCall({\n target: `${wormholePackageId}::vaa::parse_and_verify`,\n arguments: [\n tx.object(this.wormholeStateId),\n tx.pure(toPureBytes(vaa)),\n tx.object(SUI_CLOCK_OBJECT_ID)\n ]\n })\n return verifiedVaa\n })\n }\n\n private async verifyVaasAndGetHotPotato(\n tx: Transaction,\n updates: Uint8Array[],\n packageId: string\n ) {\n if (updates.length > 1) {\n throw new Error(\n 'SDK does not support sending multiple accumulator messages in a single transaction'\n )\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0])\n const [verifiedVaa] = await this.verifyVaas([vaa], tx)\n const [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(toPureBytes(updates[0])),\n verifiedVaa,\n tx.object(SUI_CLOCK_OBJECT_ID)\n ]\n })\n return priceUpdatesHotPotato\n }\n\n private async executePriceFeedUpdates(\n tx: Transaction,\n packageId: string,\n feedIds: string[],\n priceUpdatesHotPotato: any,\n coins: any[]\n ) {\n const priceInfoObjects: string[] = []\n for (const [coinId, feedId] of feedIds.entries()) {\n const priceInfoObjectId = await this.getPriceFeedObjectId(feedId)\n if (!priceInfoObjectId) {\n throw new Error(`Price feed ${feedId} not found, please create it first`)\n }\n priceInfoObjects.push(priceInfoObjectId)\n ;[priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::update_single_price_feed`,\n arguments: [\n tx.object(this.pythStateId),\n priceUpdatesHotPotato,\n tx.object(priceInfoObjectId),\n coins[coinId],\n tx.object(SUI_CLOCK_OBJECT_ID)\n ]\n })\n }\n tx.moveCall({\n target: `${packageId}::hot_potato_vector::destroy`,\n arguments: [priceUpdatesHotPotato],\n typeArguments: [`${packageId}::price_info::PriceInfo`]\n })\n return priceInfoObjects\n }\n\n private async getWormholePackageId() {\n if (!this.wormholePackageId) {\n this.wormholePackageId = await this.getPackageId(this.wormholeStateId)\n }\n return this.wormholePackageId\n }\n\n private async getPythPackageId() {\n if (!this.pythPackageId) {\n this.pythPackageId = await this.getPackageId(this.pythStateId)\n }\n return this.pythPackageId\n }\n\n private async getPriceFeedObjectId(feedId: string) {\n const normalizedFeedId = normalizePriceId(feedId)\n if (!this.priceFeedObjectIdCache.has(normalizedFeedId)) {\n const { id: tableId, fieldType } = await this.getPriceTableInfo()\n const nameType = `${fieldType}::price_identifier::PriceIdentifier`\n\n const core = this.getCoreProvider()\n if (core) {\n // Pyth's price table stores entries as plain dynamic fields\n // (0x2::dynamic_field::Field<PriceIdentifier, ID>). getDynamicObjectField\n // must not be used here: it derives the child id from\n // Wrapper<PriceIdentifier> and resolves to an object that does not exist\n // on chain, aborting every Pyth price feed update.\n const { dynamicField } = await core.getDynamicField({\n parentId: tableId,\n name: toDynamicFieldName(nameType, encodePriceIdentifier(hexToBytes(normalizedFeedId)))\n })\n const valueBcs = dynamicField?.value?.bcs\n this.priceFeedObjectIdCache.set(\n normalizedFeedId,\n valueBcs && valueBcs.length === 32\n ? bcs.Address.parse(Uint8Array.from(valueBcs))\n : undefined\n )\n } else {\n const result = await this.getDynamicMoveObjectJson(tableId, {\n type: nameType,\n value: {\n bytes: Array.from(hexToBytes(normalizedFeedId))\n }\n })\n if (!result?.fields) {\n this.priceFeedObjectIdCache.set(normalizedFeedId, undefined)\n } else {\n this.priceFeedObjectIdCache.set(normalizedFeedId, (result.fields as any).value)\n }\n }\n }\n return this.priceFeedObjectIdCache.get(normalizedFeedId)\n }\n\n private async getPriceTableInfo() {\n if (!this.priceTableInfo) {\n const fieldName = this.getCoreProvider()\n ? toDynamicFieldName('vector<u8>', encodeVectorU8('price_info'))\n : {\n type: 'vector<u8>',\n value: 'price_info'\n }\n const result = await this.getDynamicMoveObjectJson(this.pythStateId, fieldName)\n if (!result?.type) {\n throw new Error('Price Table not found, contract may not be initialized')\n }\n this.priceTableInfo = {\n id: result.objectId,\n fieldType: getPythPackageIdFromPriceTableType(result.type)\n }\n }\n return this.priceTableInfo\n }\n\n private extractVaaBytesFromAccumulatorMessage(accumulatorMessage: Uint8Array) {\n const trailingPayloadSize = accumulatorMessage[6]\n const vaaSizeOffset = 7 + trailingPayloadSize + 1\n const vaaSize = readUint16BE(accumulatorMessage, vaaSizeOffset)\n const vaaOffset = vaaSizeOffset + 2\n return accumulatorMessage.subarray(vaaOffset, vaaOffset + vaaSize)\n }\n}\n"],"names":["MAX_ARGUMENT_SIZE","normalizePriceId","priceId","hexToBytes","hex","normalized","bytes","i","readUint16BE","offset","toPureBytes","bcs","toDynamicFieldName","type","encodeVectorU8","value","encodePriceIdentifier","splitTopLevelTypeArgs","args","parts","depth","start","index","char","getPythPackageIdFromPriceTableType","tableIndex","argsStart","argsEnd","priceIdentifierSuffix","keyType","valueType","base64ToBytes","SuiPriceServiceConnection","endpoint","options","priceIds","feed","response","encoding","data","pathname","searchParams","controller","timeout","url","key","res","SuiPythClient","provider","pythStateId","wormholeStateId","core","objectId","result","parentId","name","tx","updates","feedIds","packageId","priceUpdatesHotPotato","baseUpdateFee","coins","fields","upgradeCap","vaas","wormholePackageId","vaa","verifiedVaa","SUI_CLOCK_OBJECT_ID","priceInfoObjects","coinId","feedId","priceInfoObjectId","normalizedFeedId","tableId","fieldType","nameType","dynamicField","valueBcs","fieldName","accumulatorMessage","vaaSizeOffset","vaaSize","vaaOffset"],"mappings":"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"}
package/dist/reward.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SuiClientOption, EnvOption, LendingRewardSummary, LendingReward, HistoryClaimedReward, LendingClaimedReward, TransactionResult, AccountCapOption, AccountCap, MarketOption, MarketsOption, ServiceOption } from './types';
1
+ import { SuiClientOption, EnvOption, LendingRewardSummary, LendingReward, HistoryClaimedReward, LendingClaimedReward, TransactionResult, AccountCapOption, AccountCap, MarketOption, MarketsOption, ServiceOption } from './types.js';
2
2
  import { Transaction } from '@mysten/sui/transactions';
3
3
 
4
4
  /**