@scallop-io/sui-scallop-sdk 0.44.7 → 0.44.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/common.ts","../src/constants/enum.ts","../src/models/scallop.ts","../src/models/scallopAddress.ts","../src/models/scallopClient.ts","../src/models/scallopUtils.ts","../src/models/scallopQuery.ts","../src/queries/coreQuery.ts","../src/utils/builder.ts","../src/utils/query.ts","../src/utils/util.ts","../src/queries/spoolQuery.ts","../src/queries/borrowIncentiveQuery.ts","../src/queries/priceQuery.ts","../src/queries/portfolioQuery.ts","../src/models/scallopBuilder.ts","../src/builders/coreBuilder.ts","../src/builders/oracle.ts","../src/builders/spoolBuilder.ts","../src/builders/borrowIncentiveBuilder.ts","../src/builders/index.ts"],"sourcesContent":["export const API_BASE_URL = 'https://sui.api.scallop.io';\n\nexport const ADDRESSES_ID = '6462a088a7ace142bb6d7e9b';\n\nexport const PROTOCOL_OBJECT_ID =\n '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf';\n\nexport const BORROW_FEE_PROTOCOL_ID =\n '0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da';\n\nexport const SUPPORT_POOLS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n] as const;\n\nexport const SUPPORT_COLLATERALS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n] as const;\n\nexport const SUPPORT_SPOOLS = ['ssui', 'susdc', 'susdt'] as const;\n\nexport const SUPPORT_SPOOLS_REWARDS = ['sui'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_POOLS = ['sui', 'usdc', 'usdt'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_REWARDS = ['sui'] as const;\nexport const SUPPORT_ORACLES = ['supra', 'switchboard', 'pyth'] as const;\n\nexport const SUPPORT_PACKAGES = [\n 'coinDecimalsRegistry',\n 'math',\n 'whitelist',\n 'x',\n 'protocol',\n 'protocolWhitelist',\n 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n","import type {\n SupportCoinDecimals,\n AssetCoins,\n MarketCoins,\n StakeMarketCoins,\n StakeRewardCoins,\n BorrowIncentiveRewardCoins,\n AssetCoinIds,\n WormholeCoinIds,\n VoloCoinIds,\n} from '../types';\n\nexport const coinDecimals: SupportCoinDecimals = {\n eth: 8,\n btc: 8,\n usdc: 6,\n usdt: 6,\n sui: 9,\n apt: 8,\n sol: 8,\n cetus: 9,\n afsui: 9,\n hasui: 9,\n vsui: 9,\n seth: 8,\n sbtc: 8,\n susdc: 6,\n susdt: 6,\n ssui: 9,\n sapt: 8,\n ssol: 8,\n scetus: 9,\n safsui: 9,\n shasui: 9,\n svsui: 9,\n};\n\nexport const assetCoins: AssetCoins = {\n eth: 'eth',\n btc: 'btc',\n usdc: 'usdc',\n usdt: 'usdt',\n sui: 'sui',\n apt: 'apt',\n sol: 'sol',\n cetus: 'cetus',\n afsui: 'afsui',\n hasui: 'hasui',\n vsui: 'vsui',\n};\n\nexport const marketCoins: MarketCoins = {\n seth: 'seth',\n sbtc: 'sbtc',\n susdc: 'susdc',\n susdt: 'susdt',\n ssui: 'ssui',\n sapt: 'sapt',\n ssol: 'ssol',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n};\n\nexport const stakeMarketCoins: StakeMarketCoins = {\n ssui: 'ssui',\n susdc: 'susdc',\n susdt: 'susdt',\n};\n\nexport const spoolRewardCoins: StakeRewardCoins = {\n ssui: 'sui',\n susdc: 'sui',\n susdt: 'sui',\n};\n\nexport const borrowIncentiveRewardCoins: BorrowIncentiveRewardCoins = {\n sui: 'sui',\n usdc: 'sui',\n usdt: 'sui',\n};\n\nexport const coinIds: AssetCoinIds = {\n sui: '0x0000000000000000000000000000000000000000000000000000000000000002',\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n cetus: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n afsui: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n hasui: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n\nexport const wormholeCoinIds: WormholeCoinIds = {\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n};\n\nexport const voloCoinIds: VoloCoinIds = {\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopClient } from './scallopClient';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID } from '../constants';\nimport type { ScallopParams } from '../types/';\n\n/**\n * @description\n * The main instance that controls interaction with the Scallop contract.\n *\n * @example\n * ```typescript\n * const sdk = new Scallop(<parameters>);\n * const scallopUtils= await sdk.getScallopUtils();\n * const scallopAddress = await sdk.getScallopAddress();\n * const scallopBuilder = await sdk.createScallopBuilder();\n * const scallopClient = await sdk.createScallopClient();\n * ```\n */\nexport class Scallop {\n public params: ScallopParams;\n public suiKit: SuiKit;\n\n private _address: ScallopAddress;\n\n public constructor(params: ScallopParams) {\n this.params = params;\n this.suiKit = new SuiKit(params);\n this._address = new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n }\n\n /**\n * Get a scallop address instance that already has read addresses.\n *\n * @param id - The API id of the addresses.\n * @return Scallop Address.\n */\n public async getScallopAddress(id?: string) {\n await this._address.read(id);\n\n return this._address;\n }\n\n /**\n * Create a scallop builder instance that already has initial data.\n *\n * @return Scallop Builder.\n */\n public async createScallopBuilder() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopBuilder = new ScallopBuilder(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopBuilder;\n }\n\n /**\n * Create a scallop client instance that already has initial data.\n *\n * @param walletAddress - When user cannot provide a secret key or mnemonic, the scallop client cannot directly derive the address of the transaction the user wants to sign. This argument specifies the wallet address for signing the transaction.\n * @return Scallop Client.\n */\n public async createScallopClient(walletAddress?: string) {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopClient = new ScallopClient(\n { ...this.params, walletAddress },\n { suiKit: this.suiKit, address: this._address }\n );\n\n return scallopClient;\n }\n\n /**\n * Create a scallop query instance.\n *\n * @return Scallop Query.\n */\n public async createScallopQuery() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopQuery = new ScallopQuery(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopQuery;\n }\n\n /**\n * Create a scallop utils instance.\n *\n * @return Scallop Utils.\n */\n public async createScallopUtils() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopUtils = new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopUtils;\n }\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { API_BASE_URL } from '../constants';\nimport type { NetworkType } from '@scallop-io/sui-kit';\nimport type {\n ScallopAddressParams,\n AddressesInterface,\n AddressStringPath,\n} from '../types';\n\nconst EMPTY_ADDRESSES: AddressesInterface = {\n core: {\n version: '',\n versionCap: '',\n object: '',\n market: '',\n adminCap: '',\n coinDecimalsRegistry: '',\n obligationAccessStore: '',\n coins: {\n btc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n eth: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n usdc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n usdt: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n sui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n afsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n hasui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n vsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n },\n oracles: {\n xOracle: '',\n xOracleCap: '',\n supra: {\n registry: '',\n registryCap: '',\n holder: '',\n },\n switchboard: {\n registry: '',\n registryCap: '',\n },\n pyth: {\n registry: '',\n registryCap: '',\n state: '',\n wormhole: '',\n wormholeState: '',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '',\n upgradeCap: '',\n },\n math: {\n id: '',\n upgradeCap: '',\n },\n whitelist: {\n id: '',\n upgradeCap: '',\n },\n x: {\n id: '',\n upgradeCap: '',\n },\n protocol: {\n id: '',\n upgradeCap: '',\n },\n query: {\n id: '',\n upgradeCap: '',\n },\n pyth: {\n id: '',\n upgradeCap: '',\n },\n switchboard: {\n id: '',\n upgradeCap: '',\n },\n xOracle: {\n id: '',\n upgradeCap: '',\n },\n // Deploy for faucet on testnet.\n testCoin: {\n id: '',\n upgradeCap: '',\n },\n },\n },\n spool: {\n id: '',\n adminCap: '',\n object: '',\n pools: {\n ssui: {\n id: '',\n rewardPoolId: '',\n },\n susdc: {\n id: '',\n rewardPoolId: '',\n },\n },\n },\n borrowIncentive: {\n id: '',\n adminCap: '',\n object: '',\n query: '',\n incentivePools: '',\n incentiveAccounts: '',\n },\n};\n\n/**\n * @description\n * it provides methods for managing addresses.\n *\n * @example\n * ```typescript\n * const scallopAddress = new ScallopAddress(<parameters>);\n * scallopAddress.<address functions>();\n * await scallopAddress.<address async functions>();\n * ```\n */\nexport class ScallopAddress {\n private readonly _auth?: string;\n\n private _requestClient: AxiosInstance;\n private _id?: string;\n private _network: NetworkType;\n private _currentAddresses?: AddressesInterface;\n private _addressesMap: Map<NetworkType, AddressesInterface>;\n\n public constructor(params: ScallopAddressParams) {\n const { id, auth, network } = params;\n\n if (auth) this._auth = auth;\n this._id = id;\n this._network = network || 'mainnet';\n this._addressesMap = new Map();\n this._requestClient = axios.create({\n baseURL: API_BASE_URL,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30000,\n });\n }\n\n /**\n * Get addresses API id.\n *\n * @return The addresses API id.\n */\n public getId() {\n return this._id || undefined;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @return The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._currentAddresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object'\n ? nestedAddressObj[key]\n : nestedAddressObj,\n this._currentAddresses\n );\n return value || undefined;\n } else {\n return undefined;\n }\n }\n\n /**\n * Sets the address for the specified path, it does not interact with the API.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @return The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._currentAddresses) {\n const keys = path.split('.');\n keys.reduce((nestedAddressObj: any, key: string, index) => {\n if (index === keys.length - 1) {\n nestedAddressObj[key] = address;\n } else {\n return nestedAddressObj[key];\n }\n }, this._currentAddresses);\n }\n return this._currentAddresses;\n }\n\n /**\n * Synchronize the specified network addresses from the addresses map to the\n * current addresses and change the default network to specified network.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @return Current addresses.\n */\n public switchCurrentAddresses(network: NetworkType) {\n if (this._addressesMap.has(network)) {\n this._currentAddresses = this._addressesMap.get(network);\n this._network = network;\n }\n return this._currentAddresses;\n }\n\n /**\n * Get the addresses, If `network` is not provided, returns the current\n * addresses or the default network addresses in the addresses map.\n *\n * @param network - Specifies which network's addresses you want to get.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n } else {\n return this._currentAddresses ?? this._addressesMap.get(this._network);\n }\n }\n\n /**\n * Set the addresses into addresses map. If the specified network is the same\n * as the current network, the current addresses will be updated at the same time.\n *\n * @param addresses - The addresses be setted to the tartget network.\n * @param network - Specifies which network's addresses you want to set.\n * @return The addresses.\n */\n public setAddresses(addresses: AddressesInterface, network?: NetworkType) {\n const targetNetwork = network || this._network;\n if (targetNetwork === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(targetNetwork, addresses);\n }\n\n /**\n * Get all addresses.\n *\n * @return All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n /**\n * Create a new addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication API key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async create(params?: {\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (apiKey !== undefined) {\n this._addressesMap.clear();\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.post(\n `${API_BASE_URL}/addresses`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 201) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Read and synchronizes all addresses from the API into instance.\n *\n * @param id - The id of the addresses to get.\n * @return All addresses.\n */\n public async read(id?: string) {\n const addressesId = id || this._id || undefined;\n\n if (addressesId !== undefined) {\n const response = await this._requestClient.get(\n `${API_BASE_URL}/addresses/${addressesId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error('Please provide API addresses id.');\n }\n }\n\n /**\n * Update the addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.id - The id of the addresses to update.\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication api key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async update(params?: {\n id?: string;\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { id, addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be updated.');\n if (apiKey !== undefined) {\n if (id !== this._id) {\n this._addressesMap.clear();\n }\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.put(\n `${API_BASE_URL}/addresses/${targetId}`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to update addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Deletes all addresses of a specified id through the API and clear all\n * addresses in the instance.\n *\n * @param id - The id of the addresses to delete.\n * @param auth - The authentication API key.\n */\n public async delete(id?: string, auth?: string) {\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be deleted.');\n if (apiKey !== undefined) {\n const response = await this._requestClient.delete(\n `${API_BASE_URL}/addresses/${targetId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n this._id = undefined;\n this._currentAddresses = undefined;\n this._addressesMap.clear();\n } else {\n throw Error('Failed to delete addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n}\n","import { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID, SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui.js/client';\nimport type { TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\nimport type {\n ScallopClientFnReturnType,\n ScallopInstanceParams,\n ScallopClientParams,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportAssetCoins,\n SupportStakeCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * @description\n * It provides contract interaction operations for general users.\n *\n * @example\n * ```typescript\n * const scallopClient = new ScallopClient(<parameters>);\n * await scallopClient.init();\n * scallopClient.<client functions>();\n * await scallopClient.<client async functions>();\n * ```\n */\nexport class ScallopClient {\n public readonly params: ScallopClientParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public builder: ScallopBuilder;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public walletAddress: string;\n\n public constructor(\n params: ScallopClientParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this.suiKit,\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n });\n this.builder =\n instance?.builder ??\n new ScallopBuilder(params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n utils: this.utils,\n });\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress || this.suiKit.currentAddress()\n );\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.query.init(forece);\n await this.utils.init(forece);\n await this.builder.init(forece);\n }\n\n /* ==================== Query Method ==================== */\n\n /**\n * Query market data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @return Market data.\n */\n public async queryMarket() {\n return await this.query.queryMarket();\n }\n\n /**\n * Get obligations data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getObligations(owner);\n }\n\n /**\n * Query obligation data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(obligationId: string) {\n return await this.query.queryObligation(obligationId);\n }\n\n /**\n * Query all stake accounts data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return All stake accounts data.\n */\n async getAllStakeAccounts(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getAllStakeAccounts(owner);\n }\n\n /**\n * Query stake account data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress?: string\n ) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getStakeAccounts(stakeMarketCoinName, owner);\n }\n\n /**\n * Query stake pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Stake pool data.\n */\n async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakePool(stakeMarketCoinName);\n }\n\n /**\n * Query reward pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Reward pool data.\n */\n async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakeRewardPool(stakeMarketCoinName);\n }\n\n /* ==================== Core Method ==================== */\n\n /**\n * Open obligation.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async openObligation(): Promise<SuiTransactionBlockResponse>;\n public async openObligation<S extends boolean>(\n sign?: S\n ): Promise<ScallopClientFnReturnType<S>>;\n public async openObligation<S extends boolean>(\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n txBlock.openObligationEntry();\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit collateral into the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign?: S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const obligations = await this.query.getObligations(sender);\n const tarketObligationId = obligationId || obligations[0].id;\n if (tarketObligationId) {\n await txBlock.addCollateralQuick(\n amount,\n collateralCoinName,\n tarketObligationId\n );\n } else {\n const [obligation, obligationKey, hotPotato] = txBlock.openObligation();\n await txBlock.addCollateralQuick(amount, collateralCoinName, obligation);\n txBlock.returnObligation(obligation, hotPotato);\n txBlock.transferObjects([obligationKey], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw collateral from the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdrawCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await txBlock.takeCollateralQuick(\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([collateralCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool.\n *\n * @param poolCoinName - Types of pool coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async deposit(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await txBlock.depositQuick(amount, poolCoinName);\n txBlock.transferObjects([marketCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool and Stake market coin into the corresponding spool.\n *\n * @param stakeCoinName - Types of stake coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositAndStake(\n stakeCoinName: SupportStakeCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoinName =\n this.utils.parseMarketCoinName<SupportStakeMarketCoins>(stakeCoinName);\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId || stakeAccounts[0].id;\n\n const marketCoin = await txBlock.depositQuick(amount, stakeCoinName);\n if (targetStakeAccount) {\n await txBlock.stakeQuick(\n marketCoin,\n stakeMarketCoinName,\n targetStakeAccount\n );\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(marketCoin, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw asset from the specific pool, must return market coin.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would withdraw.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdraw(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.withdrawQuick(amount, poolCoinName);\n txBlock.transferObjects([coin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Borrow asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrow<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n const coin = await txBlock.borrowQuick(\n amount,\n poolCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([coin], sender);\n if (sign && availableStake) {\n await txBlock.stakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Repay asset into the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would repay.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async repay<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n await txBlock.repayQuick(amount, poolCoinName, obligationId);\n if (sign && availableStake) {\n await txBlock.stakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * FlashLoan asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name..\n * @param amount - The amount of coins would repay.\n * @param callback - The callback function to build transaction block and return coin argument.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async flashLoan(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg\n ): Promise<SuiTransactionBlockResponse>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n const [coin, loan] = txBlock.borrowFlashLoan(amount, poolCoinName);\n txBlock.repayFlashLoan(await callback(txBlock, coin), loan, poolCoinName);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Spool Method ==================== */\n\n /**\n * Create stake account.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async createStakeAccount(\n marketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccount = txBlock.createStakeAccount(marketCoinName);\n txBlock.transferObjects([stakeAccount], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Stake market coin into the specific spool.\n *\n * @param marketCoinName - Types of market coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId || stakeAccounts[0].id;\n if (targetStakeAccount) {\n await txBlock.stakeQuick(amount, stakeMarketCoinName, targetStakeAccount);\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(amount, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoins = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId\n );\n txBlock.transferObjects(marketCoins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool and withdraw asset from the corresponding pool.\n *\n * @param marketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstakeAndWithdraw(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoins = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n const coins = [];\n for (const stakeMarketCoin of stakeMarketCoins) {\n const stakeCoinName =\n this.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const coin = await txBlock.withdraw(stakeMarketCoin, stakeCoinName);\n coins.push(coin);\n }\n txBlock.transferObjects(coins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Claim reward coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async claim(\n stakeMarketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoins = await txBlock.claimQuick(\n stakeMarketCoinName,\n stakeAccountId\n );\n txBlock.transferObjects(rewardCoins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Borrow Incentive Method ==================== */\n\n /**\n * stake obligaion.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligaionId - The obligation account object.\n * @param obligaionKeyId - The obligation key account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async stakeObligation<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.stakeObligationQuick(coinName, obligaionId, obligaionKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * unstake obligaion.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligaionId - The obligation account object.\n * @param obligaionKeyId - The obligation key account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async unstakeObligation<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.unstakeObligationQuick(coinName, obligaionId, obligaionKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * unstake market coin from the specific spool.\n *\n * @param marketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async claimBorrowIncentive<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoin = await txBlock.claimBorrowIncentiveQuick(\n coinName,\n obligaionId,\n obligaionKeyId\n );\n txBlock.transferObjects([rewardCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Other Method ==================== */\n\n /**\n * Mint and get test coin.\n *\n * @remarks\n * Only be used on the test network.\n *\n * @param assetCoinName - Specific asset coin name.\n * @param amount - The amount of coins minted and received.\n * @param receiveAddress - The wallet address that receives the coins.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async mintTestCoin(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign?: S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign: S = true as S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const isTestnet = this.params.networkType\n ? this.params.networkType === 'testnet'\n : false;\n\n if (!isTestnet) {\n throw new Error('Only be used on the test network.');\n }\n\n const txBlock = this.builder.createTxBlock();\n const recipient = receiveAddress || this.walletAddress;\n const packageId = this.address.get('core.packages.testCoin.id');\n const treasuryId = this.address.get(`core.coins.${assetCoinName}.treasury`);\n const target = `${packageId}::${assetCoinName}::mint`;\n const coin = txBlock.moveCall(target, [treasuryId, amount]);\n txBlock.transferObjects([coin], recipient);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n}\n","import { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiAddressArg, SuiKit } from '@scallop-io/sui-kit';\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport {\n ADDRESSES_ID,\n PROTOCOL_OBJECT_ID,\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n spoolRewardCoins,\n borrowIncentiveRewardCoins,\n coinDecimals,\n wormholeCoinIds,\n voloCoinIds,\n coinIds,\n} from '../constants';\nimport { queryObligation } from '../queries';\nimport {\n parseDataFromPythPriceFeed,\n isMarketCoin,\n parseAssetSymbol,\n} from '../utils';\nimport type {\n ScallopUtilsParams,\n ScallopInstanceParams,\n SupportCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n CoinPrices,\n PriceMap,\n CoinWrappedType,\n} from '../types';\n\n/**\n * @description\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopUtils = new ScallopUtils(<parameters>);\n * await scallopUtils.init();\n * scallopUtils.<utils functions>();\n * await scallopUtils.<utils functions>();\n * ```\n */\nexport class ScallopUtils {\n public readonly params: ScallopUtilsParams;\n public readonly isTestnet: boolean;\n\n private _suiKit: SuiKit;\n private _address: ScallopAddress;\n private _query: ScallopQuery;\n private _priceMap: PriceMap = new Map();\n\n public constructor(\n params: ScallopUtilsParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this._suiKit = instance?.suiKit ?? new SuiKit(params);\n this._address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this._query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this._suiKit,\n address: this._address,\n });\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this._address.getAddresses()) {\n await this._address.read();\n }\n await this._query.init(forece);\n }\n\n /**\n * Convert coin name to symbol.\n *\n * @param coinName - Specific support coin name.\n * @return Symbol string.\n */\n public parseSymbol(coinName: SupportCoins) {\n if (isMarketCoin(coinName)) {\n const assetCoinName = coinName\n .slice(1)\n .toLowerCase() as SupportAssetCoins;\n return (\n coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName)\n );\n } else {\n return parseAssetSymbol(coinName);\n }\n }\n\n /**\n * Convert coin name to coin type.\n *\n * @description\n * The Coin type of wormhole is fixed `coin:Coin`. Here using package id\n * to determine and return the type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Coin type.\n */\n public parseCoinType(coinName: SupportCoins) {\n coinName = isMarketCoin(coinName) ? this.parseCoinName(coinName) : coinName;\n const coinPackageId =\n this._address.get(`core.coins.${coinName}.id`) ||\n coinIds[coinName] ||\n undefined;\n if (!coinPackageId) {\n throw Error(`Coin ${coinName} is not supported`);\n }\n if (coinName === 'sui')\n return normalizeStructTag(`${coinPackageId}::sui::SUI`);\n const wormHolePckageIds = [\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc,\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt,\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth,\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc,\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol,\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt,\n ];\n const voloPckageIds = [\n this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui,\n ];\n if (wormHolePckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n } else if (voloPckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::cert::CERT`;\n } else {\n return `${coinPackageId}::${coinName}::${coinName.toUpperCase()}`;\n }\n }\n\n /**\n * Convert coin name to market coin type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Market coin type.\n */\n public parseMarketCoinType(coinName: SupportCoins) {\n const protocolObjectId =\n this._address.get('core.object') || PROTOCOL_OBJECT_ID;\n const coinType = this.parseCoinType(coinName);\n return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;\n }\n\n /**\n * Convert coin type to coin name.\n *\n * @description\n * The coin name cannot be obtained directly from the wormhole type. Here\n * the package id is used to determine and return a specific name.\n *\n * @param coinType - Specific support coin type.\n * @return Coin Name.\n */\n public parseCoinNameFromType<T extends SupportAssetCoins>(\n coinType: string\n ): T extends SupportAssetCoins ? T : SupportAssetCoins;\n public parseCoinNameFromType<T extends SupportMarketCoins>(\n coinType: string\n ): T extends SupportMarketCoins ? T : SupportMarketCoins;\n public parseCoinNameFromType<T extends SupportCoins>(\n coinType: string\n ): T extends SupportCoins ? T : SupportCoins;\n public parseCoinNameFromType(coinType: string) {\n coinType = normalizeStructTag(coinType);\n const coinTypeRegex = new RegExp(`((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)`);\n const coinTypeMatch = coinType.match(coinTypeRegex);\n const isMarketCoinType = coinType.includes('reserve::MarketCoin');\n coinType = coinTypeMatch?.[1] || coinType;\n\n const wormHoleCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc\n }::coin::COIN`]: 'usdc',\n [`${\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt\n }::coin::COIN`]: 'usdt',\n [`${\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth\n }::coin::COIN`]: 'eth',\n [`${\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc\n }::coin::COIN`]: 'btc',\n [`${\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol\n }::coin::COIN`]: 'sol',\n [`${\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt\n }::coin::COIN`]: 'apt',\n };\n const voloCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui\n }::cert::CERT`]: 'vsui',\n };\n\n const assetCoinName =\n wormHoleCoinTypeMap[coinType] ||\n voloCoinTypeMap[coinType] ||\n (coinType.split('::')[2].toLowerCase() as SupportAssetCoins);\n\n return isMarketCoinType\n ? this.parseMarketCoinName(assetCoinName)\n : assetCoinName;\n }\n\n /**\n * Convert marke coin name to coin name.\n *\n * @param marketCoinName - Specific support market coin name.\n * @return Coin Name.\n */\n public parseCoinName<T extends SupportAssetCoins>(marketCoinName: string) {\n return marketCoinName.slice(1) as T;\n }\n\n /**\n * Convert coin name to market coin name.\n *\n * @param coinName - Specific support coin name.\n * @return Market coin name.\n */\n public parseMarketCoinName<T extends SupportMarketCoins>(\n coinName: SupportCoins\n ) {\n return `s${coinName}` as T;\n }\n\n /**\n * Get reward type of spool.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Spool reward coin name.\n */\n public getSpoolRewardCoinName = (\n stakeMarketCoinName: SupportStakeMarketCoins\n ) => {\n return spoolRewardCoins[stakeMarketCoinName];\n };\n\n /**\n * Get reward type of borrow incentive pool.\n *\n * @param borrowIncentiveCoinName - Support borrow incentive coin.\n * @return Borrow incentive reward coin name.\n */\n public getBorrowIncentiveRewardCoinName = (\n borrowIncentiveCoinName: SupportBorrowIncentiveCoins\n ) => {\n return borrowIncentiveRewardCoins[borrowIncentiveCoinName];\n };\n\n /**\n * Get coin decimal.\n *\n * return Coin decimal.\n */\n public getCoinDecimal(coinName: SupportCoins) {\n return coinDecimals[coinName];\n }\n\n /**\n * Get coin wrapped type.\n *\n * return Coin wrapped type.\n */\n public getCoinWrappedType(assetCoinName: SupportAssetCoins): CoinWrappedType {\n return assetCoinName === 'usdc' ||\n assetCoinName === 'usdt' ||\n assetCoinName === 'eth' ||\n assetCoinName === 'btc' ||\n assetCoinName === 'apt' ||\n assetCoinName === 'sol'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n }\n\n /**\n * Select coin id that add up to the given amount as transaction arguments.\n *\n * @param ownerAddress - The address of the owner.\n * @param amount - The amount that including coin decimals.\n * @param coinType - The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoinIds(\n amount: number,\n coinType: string = SUI_TYPE_ARG,\n ownerAddress?: string\n ) {\n ownerAddress = ownerAddress || this._suiKit.currentAddress();\n const coins = await this._suiKit.suiInteractor.selectCoins(\n ownerAddress,\n amount,\n coinType\n );\n return coins.map((c) => c.objectId);\n }\n\n /**\n * Get all asset coin names in the obligation record by obligation id.\n *\n * @description\n * This can often be used to determine which assets in an obligation require\n * price updates before interacting with specific instructions of the Scallop contract.\n *\n * @param obligationId - The obligation id.\n * @return Asset coin Names.\n */\n public async getObligationCoinNames(obligationId: SuiAddressArg) {\n const obligation = await queryObligation(this._query, obligationId);\n const collateralCoinTypes = obligation.collaterals.map((collateral) => {\n return `0x${collateral.type.name}`;\n });\n const debtCoinTypes = obligation.debts.map((debt) => {\n return `0x${debt.type.name}`;\n });\n const obligationCoinTypes = [\n ...new Set([...collateralCoinTypes, ...debtCoinTypes]),\n ];\n const obligationCoinNames = obligationCoinTypes.map((coinType) => {\n return this.parseCoinNameFromType(coinType);\n });\n return obligationCoinNames;\n }\n\n /**\n * Get asset coin price.\n *\n * @description\n * The strategy for obtaining the price is to get it through API first,\n * and then on-chain data if API cannot be retrieved.\n * Currently, we only support obtaining from pyth protocol, other\n * oracles will be supported in the future.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @return Asset coin price.\n */\n public async getCoinPrices(assetCoinNames?: SupportAssetCoins[]) {\n assetCoinNames =\n assetCoinNames ||\n ([\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ] as SupportAssetCoins[]);\n\n const coinPrices: CoinPrices = {};\n const existPricesCoinNames: SupportAssetCoins[] = [];\n const lackPricesCoinNames: SupportAssetCoins[] = [];\n\n assetCoinNames.forEach((assetCoinName) => {\n if (\n this._priceMap.has(assetCoinName) &&\n Date.now() - this._priceMap.get(assetCoinName)!.publishTime < 1000 * 60\n ) {\n existPricesCoinNames.push(assetCoinName);\n } else {\n lackPricesCoinNames.push(assetCoinName);\n }\n });\n\n if (existPricesCoinNames.length > 0) {\n for (const coinName of existPricesCoinNames) {\n coinPrices[coinName] = this._priceMap.get(coinName)!.price;\n }\n }\n\n if (lackPricesCoinNames.length > 0) {\n const pythConnection = new SuiPriceServiceConnection(\n this.isTestnet\n ? 'https://hermes-beta.pyth.network'\n : 'https://hermes.pyth.network'\n );\n const priceIds = lackPricesCoinNames.map((coinName) =>\n this._address.get(`core.coins.${coinName}.oracle.pyth.feed`)\n );\n try {\n const priceFeeds =\n (await pythConnection.getLatestPriceFeeds(priceIds)) || [];\n for (const [index, feed] of priceFeeds.entries()) {\n const data = parseDataFromPythPriceFeed(feed, this._address);\n const coinName = lackPricesCoinNames[index];\n this._priceMap.set(coinName, {\n price: data.price,\n publishTime: data.publishTime,\n });\n coinPrices[coinName] = data.price;\n }\n } catch (_e) {\n for (const coinName of lackPricesCoinNames) {\n const price = await this._query.getPriceFromPyth(coinName);\n this._priceMap.set(coinName, {\n price: price,\n publishTime: Date.now(),\n });\n coinPrices[coinName] = price;\n }\n }\n }\n\n return coinPrices;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The annual percentage rate (APR).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage yield (APY) for the given APR and compounding frequency.\n */\n public parseAprToApy(apr: number, compoundFrequency = 365) {\n return (1 + apr / compoundFrequency) ** compoundFrequency - 1;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The equivalent annual percentage yield (APY).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage rate (APR) for the given APY and compounding frequency.\n */\n public parseApyToApr(apy: number, compoundFrequency = 365) {\n return ((1 + apy) ** (1 / compoundFrequency) - 1) * compoundFrequency;\n }\n}\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID, SUPPORT_SPOOLS } from '../constants';\nimport {\n queryMarket,\n getObligations,\n queryObligation,\n getStakeAccounts,\n getStakePool,\n getStakeRewardPool,\n getPythPrice,\n getMarketPools,\n getMarketPool,\n getMarketCollaterals,\n getMarketCollateral,\n getSpools,\n getSpool,\n queryBorrowIncentivePools,\n queryBorrowIncentiveAccounts,\n getCoinAmounts,\n getCoinAmount,\n getMarketCoinAmounts,\n getMarketCoinAmount,\n getLendings,\n getLending,\n getObligationAccounts,\n getObligationAccount,\n getTotalValueLocked,\n} from '../queries';\nimport {\n ScallopQueryParams,\n ScallopInstanceParams,\n SupportStakeMarketCoins,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportMarketCoins,\n StakePools,\n StakeRewardPools,\n SupportBorrowIncentiveCoins,\n} from '../types';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\n\n/**\n * @description\n * it provides methods for getting on-chain data from the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopQuery = new ScallopQuery(<parameters>);\n * await scallopQuery.init();\n * scallopQuery.<query functions>();\n * await scallopQuery.<query functions>();\n * ```\n */\nexport class ScallopQuery {\n public readonly params: ScallopQueryParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public utils: ScallopUtils;\n\n public constructor(\n params: ScallopQueryParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this,\n });\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.utils.init(forece);\n }\n\n /* ==================== Core Query Methods ==================== */\n\n /**\n * Query market data.\n *\n * @return Market data.\n */\n public async queryMarket() {\n return await queryMarket(this);\n }\n\n /**\n * Get market pools.\n *\n * @description\n * To obtain all market pools at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @return Market pools data.\n */\n public async getMarketPools(poolCoinNames?: SupportPoolCoins[]) {\n return await getMarketPools(this, poolCoinNames);\n }\n\n /**\n * Get market pool\n *\n * @param poolCoinName - Specific support pool coin name.\n * @return Market pool data.\n */\n public async getMarketPool(poolCoinName: SupportPoolCoins) {\n return await getMarketPool(this, poolCoinName);\n }\n\n /**\n * Get market collaterals.\n *\n * @description\n * To obtain all market collaterals at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @return Market collaterals data.\n */\n public async getMarketCollaterals(\n collateralCoinNames?: SupportCollateralCoins[]\n ) {\n return await getMarketCollaterals(this, collateralCoinNames);\n }\n\n /**\n * Get market collateral\n *\n * @param collateralCoinName - Specific support collateral coin name.\n * @return Market collateral data.\n */\n public async getMarketCollateral(collateralCoinName: SupportCollateralCoins) {\n return await getMarketCollateral(this, collateralCoinName);\n }\n\n /**\n * Get obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n return await getObligations(this, ownerAddress);\n }\n\n /**\n * Query obligation data.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(obligationId: string) {\n return queryObligation(this, obligationId);\n }\n\n /**\n * Get all asset coin amounts.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All coin amounts.\n */\n public async getCoinAmounts(\n assetCoinNames?: SupportAssetCoins[],\n ownerAddress?: string\n ) {\n return await getCoinAmounts(this, assetCoinNames, ownerAddress);\n }\n\n /**\n * Get asset coin amount.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Coin amount.\n */\n public async getCoinAmount(\n assetCoinName: SupportAssetCoins,\n ownerAddress?: string\n ) {\n return await getCoinAmount(this, assetCoinName, ownerAddress);\n }\n\n /**\n * Get all market coin amounts.\n *\n * @param coinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All market market coin amounts.\n */\n public async getMarketCoinAmounts(\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress?: string\n ) {\n return await getMarketCoinAmounts(this, marketCoinNames, ownerAddress);\n }\n\n /**\n * Get market coin amount.\n *\n * @param coinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Market market coin amount.\n */\n public async getMarketCoinAmount(\n marketCoinName: SupportMarketCoins,\n ownerAddress?: string\n ) {\n return await getMarketCoinAmount(this, marketCoinName, ownerAddress);\n }\n\n /**\n * Get price from pyth fee object.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\n public async getPriceFromPyth(assetCoinName: SupportAssetCoins) {\n return await getPythPrice(this, assetCoinName);\n }\n\n /* ==================== Spool Query Methods ==================== */\n\n /**\n * Get spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Spools data.\n */\n public async getSpools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n return await getSpools(this, stakeMarketCoinNames);\n }\n\n /**\n * Get spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Spool data.\n */\n public async getSpool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await getSpool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake accounts data for all stake pools (spools).\n *\n * @param ownerAddress - The owner address.\n * @return All Stake accounts data.\n */\n public async getAllStakeAccounts(ownerAddress?: string) {\n return await getStakeAccounts(this, ownerAddress);\n }\n\n /**\n * Get stake accounts data for specific stake pool (spool).\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n public async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress?: string\n ) {\n const allStakeAccount = await this.getAllStakeAccounts(ownerAddress);\n return allStakeAccount[stakeMarketCoinName] ?? [];\n }\n\n /**\n * Get stake pools (spools) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Stake pools data.\n */\n public async getStakePools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n stakeMarketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakePools: StakePools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakePool = await getStakePool(this, stakeMarketCoinName);\n\n if (stakePool) {\n stakePools[stakeMarketCoinName] = stakePool;\n }\n }\n\n return stakePools;\n }\n\n /**\n * Get stake pool (spool) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get all spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\n public async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await getStakePool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake reward pools data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of stake market coin name.\n * @return Stake reward pools data.\n */\n public async getStakeRewardPools(\n stakeMarketCoinNames?: SupportStakeMarketCoins[]\n ) {\n stakeMarketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakeRewardPools: StakeRewardPools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakeRewardPool = await getStakeRewardPool(\n this,\n stakeMarketCoinName\n );\n\n if (stakeRewardPool) {\n stakeRewardPools[stakeMarketCoinName] = stakeRewardPool;\n }\n }\n\n return stakeRewardPools;\n }\n\n /**\n * Get stake reward pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get spool data.\n *\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool data.\n */\n public async getStakeRewardPool(\n stakeMarketCoinName: SupportStakeMarketCoins\n ) {\n return await getStakeRewardPool(this, stakeMarketCoinName);\n }\n\n /**\n * Get borrow incentive pools data.\n *\n * @param coinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive pools data.\n */\n public async getBorrowIncentivePools(\n coinNames?: SupportBorrowIncentiveCoins[]\n ) {\n return await queryBorrowIncentivePools(this, coinNames);\n }\n\n /**\n * Get borrow incentive accounts data.\n *\n * @param coinNames - Specific support borrow incentive coin name.\n * @param ownerAddress - The owner address.\n * @return Borrow incentive accounts data.\n */\n public async getBorrowIncentiveAccounts(\n obligationId: string,\n coinNames?: SupportBorrowIncentiveCoins[]\n ) {\n return await queryBorrowIncentiveAccounts(this, obligationId, coinNames);\n }\n\n /**\n * Get user lending and spool infomation for specific pools.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @return All lending and spool infomation.\n */\n public async getLendings(\n poolCoinNames?: SupportPoolCoins[],\n ownerAddress?: string\n ) {\n return await getLendings(this, poolCoinNames, ownerAddress);\n }\n\n /**\n * Get user lending and spool information for specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param ownerAddress - The owner address.\n * @return Lending pool data.\n */\n public async getLending(\n poolCoinName: SupportPoolCoins,\n ownerAddress?: string\n ) {\n return await getLending(this, poolCoinName, ownerAddress);\n }\n\n /**\n * Get user all obligation accounts information.\n *\n * @description\n * All collateral and borrowing information in all obligation accounts owned by the user.\n *\n * @param ownerAddress - The owner address.\n * @return All obligation accounts information.\n */\n public async getObligationAccounts(ownerAddress?: string) {\n return await getObligationAccounts(this, ownerAddress);\n }\n\n /**\n * Get obligation account information for specific id.\n *\n * @description\n * borrowing and obligation information for specific pool.\n *\n * @param obligationId - The obligation id.\n * @param ownerAddress - The owner address.\n * @return Borrowing and collateral information.\n */\n public async getObligationAccount(\n obligationId: string,\n ownerAddress?: string\n ) {\n return await getObligationAccount(this, obligationId, ownerAddress);\n }\n\n /**\n * Get total value locked.\n *\n * @description\n * Include total supplied value and total borrowed value.\n *\n * @return Total value locked.\n */\n public async getTvl() {\n return await getTotalValueLocked(this);\n }\n}\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport BigNumber from 'bignumber.js';\nimport {\n SUPPORT_POOLS,\n PROTOCOL_OBJECT_ID,\n SUPPORT_COLLATERALS,\n BORROW_FEE_PROTOCOL_ID,\n} from '../constants';\nimport {\n parseOriginMarketPoolData,\n calculateMarketPoolData,\n parseOriginMarketCollateralData,\n calculateMarketCollateralData,\n} from '../utils';\nimport type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopQuery } from '../models';\nimport {\n Market,\n MarketPools,\n MarketPool,\n MarketCollaterals,\n MarketCollateral,\n MarketQueryInterface,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n ObligationQueryInterface,\n Obligation,\n InterestModel,\n BorrowIndex,\n BalanceSheet,\n RiskModel,\n CollateralStat,\n CoinAmounts,\n MarketCoinAmounts,\n SupportMarketCoins,\n} from '../types';\n\n/**\n * Query market data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param rateType - How interest rates are calculated.\n * @return Market data.\n */\nexport const queryMarket = async (query: ScallopQuery) => {\n const packageId = query.address.get('core.packages.query.id');\n const marketId = query.address.get('core.market');\n const txBlock = new SuiKitTxBlock();\n const queryTarget = `${packageId}::market_query::market_data`;\n txBlock.moveCall(queryTarget, [marketId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const marketData = queryResult.events[0].parsedJson as MarketQueryInterface;\n\n const pools: MarketPools = {};\n const collaterals: MarketCollaterals = {};\n\n for (const pool of marketData.pools) {\n const coinType = normalizeStructTag(pool.type.name);\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportPoolCoins>(coinType);\n const coinPrice =\n (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName] ?? 0;\n\n // Filter pools not yet supported by the SDK.\n if (!SUPPORT_POOLS.includes(poolCoinName)) {\n continue;\n }\n\n const parsedMarketPoolData = parseOriginMarketPoolData({\n type: pool.type,\n maxBorrowRate: pool.maxBorrowRate,\n interestRate: pool.interestRate,\n interestRateScale: pool.interestRateScale,\n borrowIndex: pool.borrowIndex,\n lastUpdated: pool.lastUpdated,\n cash: pool.cash,\n debt: pool.debt,\n marketCoinSupply: pool.marketCoinSupply,\n reserve: pool.reserve,\n reserveFactor: pool.reserveFactor,\n borrowWeight: pool.borrowWeight,\n borrowFeeRate: pool.borrowFeeRate,\n baseBorrowRatePerSec: pool.baseBorrowRatePerSec,\n borrowRateOnHighKink: pool.borrowRateOnHighKink,\n borrowRateOnMidKink: pool.borrowRateOnMidKink,\n highKink: pool.highKink,\n midKink: pool.midKink,\n minBorrowAmount: pool.minBorrowAmount,\n });\n\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n\n pools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinDecimal: query.utils.getCoinDecimal(poolCoinName),\n coinPrice: coinPrice,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n };\n }\n\n for (const collateral of marketData.collaterals) {\n const coinType = normalizeStructTag(collateral.type.name);\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(coinType);\n const coinPrice =\n (await query.utils.getCoinPrices([collateralCoinName]))?.[\n collateralCoinName\n ] ?? 0;\n\n // Filter collaterals not yet supported by the SDK.\n if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {\n continue;\n }\n\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: collateral.type,\n collateralFactor: collateral.collateralFactor,\n liquidationFactor: collateral.collateralFactor,\n liquidationDiscount: collateral.liquidationDiscount,\n liquidationPanelty: collateral.liquidationPanelty,\n liquidationReserveFactor: collateral.liquidationReserveFactor,\n maxCollateralAmount: collateral.maxCollateralAmount,\n totalCollateralAmount: collateral.totalCollateralAmount,\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n collaterals[collateralCoinName] = {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinDecimal: query.utils.getCoinDecimal(collateralCoinName),\n coinPrice: coinPrice,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculatedMarketCollateralData,\n };\n }\n\n return {\n pools,\n collaterals,\n data: marketData,\n } as Market;\n};\n\n/**\n * Get coin market pools data.\n *\n * @description\n * To obtain all market pools information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param coinNames - Specific an array of support pool coin name.\n * @return Market pools data.\n */\nexport const getMarketPools = async (\n query: ScallopQuery,\n poolCoinNames?: SupportPoolCoins[]\n) => {\n poolCoinNames = poolCoinNames || [...SUPPORT_POOLS];\n const marketId = query.address.get('core.market');\n const marketObjectResponse = await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n });\n const coinPrices = await query.utils.getCoinPrices(poolCoinNames ?? []);\n\n const marketPools: MarketPools = {};\n for (const poolCoinName of poolCoinNames) {\n const marketPool = await getMarketPool(\n query,\n poolCoinName,\n marketObjectResponse.data,\n coinPrices?.[poolCoinName]\n );\n\n if (marketPool) {\n marketPools[poolCoinName] = marketPool;\n }\n }\n\n return marketPools;\n};\n\n/**\n * Get market pool data.\n *\n * @param query - The Scallop query instance.\n * @param poolCoinName - Specific support pool coin name.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market pool data.\n */\nexport const getMarketPool = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n marketObject?: SuiObjectData | null,\n coinPrice?: number\n) => {\n const marketId = query.address.get('core.market');\n marketObject =\n marketObject ||\n (\n await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n })\n ).data;\n\n let marketPool: MarketPool | undefined;\n let balanceSheet: BalanceSheet | undefined;\n let borrowIndex: BorrowIndex | undefined;\n let interestModel: InterestModel | undefined;\n let borrowFeeRate: { value: string } | undefined;\n if (marketObject) {\n if (marketObject.content && 'fields' in marketObject.content) {\n const fields = marketObject.content.fields as any;\n const coinType = query.utils.parseCoinType(poolCoinName);\n\n // Get balance sheet.\n const balanceSheetParentId =\n fields.vault.fields.balance_sheets.fields.table.fields.id.id;\n const balanceSheetDdynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: balanceSheetParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const balanceSheetDdynamicFieldObject =\n balanceSheetDdynamicFieldObjectResponse.data;\n if (\n balanceSheetDdynamicFieldObject &&\n balanceSheetDdynamicFieldObject.content &&\n 'fields' in balanceSheetDdynamicFieldObject.content\n ) {\n const dynamicFields = balanceSheetDdynamicFieldObject.content\n .fields as any;\n balanceSheet = dynamicFields.value.fields;\n }\n\n // Get borrow index.\n const borrowIndexParentId =\n fields.borrow_dynamics.fields.table.fields.id.id;\n const borrowIndexDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: borrowIndexParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const borrowIndexDynamicFieldObject =\n borrowIndexDynamicFieldObjectResponse.data;\n if (\n borrowIndexDynamicFieldObject &&\n borrowIndexDynamicFieldObject.content &&\n 'fields' in borrowIndexDynamicFieldObject.content\n ) {\n const dynamicFields = borrowIndexDynamicFieldObject.content\n .fields as any;\n borrowIndex = dynamicFields.value.fields;\n }\n\n // Get interest models.\n const interestModelParentId =\n fields.interest_models.fields.table.fields.id.id;\n const interestModelDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: interestModelParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const interestModelDynamicFieldObject =\n interestModelDynamicFieldObjectResponse.data;\n if (\n interestModelDynamicFieldObject &&\n interestModelDynamicFieldObject.content &&\n 'fields' in interestModelDynamicFieldObject.content\n ) {\n const dynamicFields = interestModelDynamicFieldObject.content\n .fields as any;\n interestModel = dynamicFields.value.fields;\n }\n\n // Get borrow fee.\n const borrowFeeDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: marketId,\n name: {\n type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,\n value: {\n type: {\n name: coinType.substring(2),\n },\n },\n },\n });\n\n const borrowFeeDynamicFieldObject =\n borrowFeeDynamicFieldObjectResponse.data;\n if (\n borrowFeeDynamicFieldObject &&\n borrowFeeDynamicFieldObject.content &&\n 'fields' in borrowFeeDynamicFieldObject.content\n ) {\n const dynamicFields = borrowFeeDynamicFieldObject.content.fields as any;\n borrowFeeRate = dynamicFields.value.fields;\n }\n }\n }\n\n if (balanceSheet && borrowIndex && interestModel && borrowFeeRate) {\n const parsedMarketPoolData = parseOriginMarketPoolData({\n type: interestModel.type.fields,\n maxBorrowRate: interestModel.max_borrow_rate.fields,\n interestRate: borrowIndex.interest_rate.fields,\n interestRateScale: borrowIndex.interest_rate_scale,\n borrowIndex: borrowIndex.borrow_index,\n lastUpdated: borrowIndex.last_updated,\n cash: balanceSheet.cash,\n debt: balanceSheet.debt,\n marketCoinSupply: balanceSheet.market_coin_supply,\n reserve: balanceSheet.revenue,\n reserveFactor: interestModel.revenue_factor.fields,\n borrowWeight: interestModel.borrow_weight.fields,\n borrowFeeRate: borrowFeeRate,\n baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,\n borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,\n borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,\n highKink: interestModel.high_kink.fields,\n midKink: interestModel.mid_kink.fields,\n minBorrowAmount: interestModel.min_borrow_amount,\n });\n\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];\n marketPool = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinDecimal: query.utils.getCoinDecimal(poolCoinName),\n coinPrice: coinPrice ?? 0,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n };\n }\n\n return marketPool;\n};\n\n/**\n * Get coin market collaterals data.\n *\n * @description\n * To obtain all market collaterals information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @return Market collaterals data.\n */\nexport const getMarketCollaterals = async (\n query: ScallopQuery,\n collateralCoinNames?: SupportCollateralCoins[]\n) => {\n collateralCoinNames = collateralCoinNames || [...SUPPORT_COLLATERALS];\n const marketId = query.address.get('core.market');\n const marketObjectResponse = await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n });\n const coinPrices = await query.utils.getCoinPrices(collateralCoinNames ?? []);\n\n const marketCollaterals: MarketCollaterals = {};\n for (const collateralCoinName of collateralCoinNames) {\n const marketCollateral = await getMarketCollateral(\n query,\n collateralCoinName,\n marketObjectResponse.data,\n coinPrices?.[collateralCoinName]\n );\n\n if (marketCollateral) {\n marketCollaterals[collateralCoinName] = marketCollateral;\n }\n }\n\n return marketCollaterals;\n};\n\n/**\n * Get market collateral data.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinName - Specific support collateral coin name.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market collateral data.\n */\nexport const getMarketCollateral = async (\n query: ScallopQuery,\n collateralCoinName: SupportCollateralCoins,\n marketObject?: SuiObjectData | null,\n coinPrice?: number\n) => {\n const marketId = query.address.get('core.market');\n marketObject =\n marketObject ||\n (\n await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n })\n ).data;\n\n let marketCollateral: MarketCollateral | undefined;\n let riskModel: RiskModel | undefined;\n let collateralStat: CollateralStat | undefined;\n if (marketObject) {\n if (marketObject.content && 'fields' in marketObject.content) {\n const fields = marketObject.content.fields as any;\n const coinType = query.utils.parseCoinType(collateralCoinName);\n\n // Get risk model.\n const riskModelParentId = fields.risk_models.fields.table.fields.id.id;\n const riskModelDdynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: riskModelParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const riskModelDdynamicFieldObject =\n riskModelDdynamicFieldObjectResponse.data;\n if (\n riskModelDdynamicFieldObject &&\n riskModelDdynamicFieldObject.content &&\n 'fields' in riskModelDdynamicFieldObject.content\n ) {\n const dynamicFields = riskModelDdynamicFieldObject.content\n .fields as any;\n riskModel = dynamicFields.value.fields;\n }\n\n // Get collateral stat.\n const collateralStatParentId =\n fields.collateral_stats.fields.table.fields.id.id;\n const collateralStatDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: collateralStatParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const collateralStatDynamicFieldObject =\n collateralStatDynamicFieldObjectResponse.data;\n if (\n collateralStatDynamicFieldObject &&\n collateralStatDynamicFieldObject.content &&\n 'fields' in collateralStatDynamicFieldObject.content\n ) {\n const dynamicFields = collateralStatDynamicFieldObject.content\n .fields as any;\n collateralStat = dynamicFields.value.fields;\n }\n }\n }\n\n if (riskModel && collateralStat) {\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: riskModel.type.fields,\n collateralFactor: riskModel.collateral_factor.fields,\n liquidationFactor: riskModel.liquidation_factor.fields,\n liquidationDiscount: riskModel.liquidation_discount.fields,\n liquidationPanelty: riskModel.liquidation_penalty.fields,\n liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,\n maxCollateralAmount: riskModel.max_collateral_amount,\n totalCollateralAmount: collateralStat.amount,\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([collateralCoinName]))?.[\n collateralCoinName\n ];\n marketCollateral = {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: query.utils.parseCoinType(collateralCoinName),\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinDecimal: query.utils.getCoinDecimal(collateralCoinName),\n coinPrice: coinPrice ?? 0,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculatedMarketCollateralData,\n };\n }\n\n return marketCollateral;\n};\n\n/**\n * Query all owned obligations.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned obligations.\n */\nexport const getObligations = async (\n query: ScallopQuery,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const protocolObjectId =\n query.address.get('core.object') || PROTOCOL_OBJECT_ID;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedKeyObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n StructType: `${protocolObjectId}::obligation::ObligationKey`,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (\n paginatedKeyObjectsResponse.hasNextPage &&\n paginatedKeyObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const keyObjectIds: string[] = keyObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const keyObjects = await query.suiKit.getObjects(keyObjectIds);\n const obligations: Obligation[] = [];\n for (const keyObject of keyObjects) {\n const keyId = keyObject.objectId;\n if (keyObject.content && 'fields' in keyObject.content) {\n const fields = keyObject.content.fields as any;\n const obligationId = String(fields.ownership.fields.of);\n const locked = await getObligationLocked(query, obligationId);\n obligations.push({ id: obligationId, keyId, locked });\n }\n }\n return obligations;\n};\n\n/**\n * Query obligation locked status.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation locked status.\n */\nexport const getObligationLocked = async (\n query: ScallopQuery,\n obligationId: string\n) => {\n const obligationObjectResponse = await query.suiKit.client().getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectResponse.data &&\n obligationObjectResponse?.data?.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectResponse.data.content.fields\n ) {\n obligationLocked = Boolean(\n obligationObjectResponse.data.content.fields.lock_key\n );\n }\n\n return obligationLocked;\n};\n\n/**\n * Query obligation data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\nexport const queryObligation = async (\n query: ScallopQuery,\n obligationId: SuiAddressArg\n) => {\n const packageId = query.address.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data`;\n const txBlock = new SuiKitTxBlock();\n txBlock.moveCall(queryTarget, [obligationId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n return queryResult.events[0].parsedJson as ObligationQueryInterface;\n};\n\n/**\n * Query all owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All owned coin amounts.\n */\nexport const getCoinAmounts = async (\n query: ScallopQuery,\n assetCoinNames?: SupportAssetCoins[],\n ownerAddress?: string\n) => {\n assetCoinNames = assetCoinNames || [...SUPPORT_POOLS];\n const owner = ownerAddress || query.suiKit.currentAddress();\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n MatchAny: assetCoinNames.map((assetCoinName) => {\n const coinType = query.utils.parseCoinType(assetCoinName);\n return { StructType: `0x2::coin::Coin<${coinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (\n paginatedCoinObjectsResponse.hasNextPage &&\n paginatedCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const coinAmounts: CoinAmounts = {};\n const coinObjects = coinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const coinObject of coinObjects) {\n const type = coinObject.type as string;\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportPoolCoins>(type);\n if (poolCoinName) {\n coinAmounts[poolCoinName] = BigNumber(coinAmounts[poolCoinName] ?? 0)\n .plus(fields.balance)\n .toNumber();\n }\n }\n }\n return coinAmounts;\n};\n\n/**\n * Query owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Owned coin amount.\n */\nexport const getCoinAmount = async (\n query: ScallopQuery,\n assetCoinName: SupportAssetCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const coinType = query.utils.parseCoinType(assetCoinName);\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${coinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (\n paginatedCoinObjectsResponse.hasNextPage &&\n paginatedCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n let coinAmount: number = 0;\n const coinObjects = coinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const coinObject of coinObjects) {\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n coinAmount = BigNumber(coinAmount).plus(fields.balance).toNumber();\n }\n }\n return coinAmount;\n};\n\n/**\n * Query all owned market coins (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All owned market coins amount.\n */\nexport const getMarketCoinAmounts = async (\n query: ScallopQuery,\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress?: string\n) => {\n marketCoinNames =\n marketCoinNames ||\n [...SUPPORT_POOLS].map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const owner = ownerAddress || query.suiKit.currentAddress();\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n MatchAny: marketCoinNames.map((marketCoinName) => {\n const marketCoinType =\n query.utils.parseMarketCoinType(marketCoinName);\n return { StructType: `0x2::coin::Coin<${marketCoinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (\n paginatedMarketCoinObjectsResponse.hasNextPage &&\n paginatedMarketCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const marketCoinAmounts: MarketCoinAmounts = {};\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const marketCoinObject of marketCoinObjects) {\n const marketCoinType = marketCoinObject.type as string;\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n const marketCoinName =\n query.utils.parseCoinNameFromType<SupportMarketCoins>(marketCoinType);\n if (marketCoinName) {\n marketCoinAmounts[marketCoinName] = BigNumber(\n marketCoinAmounts[marketCoinName] ?? 0\n )\n .plus(fields.balance)\n .toNumber();\n }\n }\n }\n return marketCoinAmounts;\n};\n\n/**\n * Query owned market coin (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Owned market coin amount.\n */\nexport const getMarketCoinAmount = async (\n query: ScallopQuery,\n marketCoinName: SupportMarketCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${marketCoinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (\n paginatedMarketCoinObjectsResponse.hasNextPage &&\n paginatedMarketCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n let marketCoinAmount: number = 0;\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const marketCoinObject of marketCoinObjects) {\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n marketCoinAmount = BigNumber(marketCoinAmount)\n .plus(fields.balance)\n .toNumber();\n }\n }\n return marketCoinAmount;\n};\n","import type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\n\n/**\n * Check and get the sender from the transaction block.\n *\n * @param txBlock - TxBlock created by SuiKit.\n * @return Sender of transaction.\n */\nexport const requireSender = (txBlock: SuiKitTxBlock) => {\n const sender = txBlock.blockData.sender;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n","import BigNumber from 'bignumber.js';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\nimport type { ScallopUtils } from '../models';\nimport type {\n OriginMarketPoolData,\n ParsedMarketPoolData,\n CalculatedMarketPoolData,\n OriginMarketCollateralData,\n ParsedMarketCollateralData,\n CalculatedMarketCollateralData,\n OriginSpoolData,\n ParsedSpoolData,\n CalculatedSpoolData,\n OriginSpoolRewardPoolData,\n ParsedSpoolRewardPoolData,\n CalculatedSpoolRewardPoolData,\n OriginBorrowIncentivePoolData,\n ParsedBorrowIncentivePoolData,\n CalculatedBorrowIncentivePoolData,\n OriginBorrowIncentiveRewardPoolData,\n ParsedBorrowIncentiveRewardPoolData,\n CalculatedBorrowIncentiveRewardPoolData,\n OriginBorrowIncentiveAccountData,\n ParsedBorrowIncentiveAccountData,\n SupportPoolCoins,\n SupportCollateralCoins,\n} from '../types';\n\n/**\n * Parse origin market pool data to a more readable format.\n *\n * @param originMarketPoolData - Origin market pool data\n * @return Parsed market pool data\n */\nexport const parseOriginMarketPoolData = (\n originMarketPoolData: OriginMarketPoolData\n): ParsedMarketPoolData => {\n return {\n coinType: normalizeStructTag(originMarketPoolData.type.name),\n // Parse origin data required for basic calculations.\n maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,\n borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,\n borrowRateScale: Number(originMarketPoolData.interestRateScale),\n borrowIndex: Number(originMarketPoolData.borrowIndex),\n lastUpdated: Number(originMarketPoolData.lastUpdated),\n cashAmount: Number(originMarketPoolData.cash),\n debtAmount: Number(originMarketPoolData.debt),\n marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),\n reserveAmount: Number(originMarketPoolData.reserve),\n reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,\n borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,\n borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,\n // Parse origin data required for additional display.\n baseBorrowRate:\n Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,\n borrowRateOnHighKink:\n Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,\n borrowRateOnMidKink:\n Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,\n highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,\n midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,\n minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),\n };\n};\n\nexport const calculateMarketPoolData = (\n utils: ScallopUtils,\n parsedMarketPoolData: ParsedMarketPoolData\n): CalculatedMarketPoolData => {\n const poolCoinName = utils.parseCoinNameFromType<SupportPoolCoins>(\n parsedMarketPoolData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(poolCoinName);\n\n const borrowYearFactor = 24 * 365 * 3600;\n\n const baseBorrowApr =\n (parsedMarketPoolData.baseBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnHighKink =\n (parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnMidKink =\n (parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const maxBorrowApr =\n (parsedMarketPoolData.maxBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowApr =\n (parsedMarketPoolData.borrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n\n const timeDelta =\n Math.floor(new Date().getTime() / 1000) - parsedMarketPoolData.lastUpdated;\n const borrowIndexDelta = BigNumber(parsedMarketPoolData.borrowIndex)\n .multipliedBy(\n BigNumber(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate)\n )\n .dividedBy(parsedMarketPoolData.borrowRateScale);\n const currentBorrowIndex = BigNumber(parsedMarketPoolData.borrowIndex).plus(\n borrowIndexDelta\n );\n // How much accumulated interest since `lastUpdate`.\n const growthInterest = BigNumber(currentBorrowIndex)\n .dividedBy(parsedMarketPoolData.borrowIndex)\n .minus(1);\n const increasedDebtAmount = BigNumber(\n parsedMarketPoolData.debtAmount\n ).multipliedBy(growthInterest);\n const borrowAmount = increasedDebtAmount.plus(\n parsedMarketPoolData.debtAmount\n );\n const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);\n const reserveAmount = BigNumber(parsedMarketPoolData.reserveAmount).plus(\n increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor)\n );\n const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);\n const supplyAmount = BigNumber(borrowAmount).plus(\n Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0)\n );\n const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);\n let utilizationRate = BigNumber(borrowAmount).dividedBy(supplyAmount);\n utilizationRate = utilizationRate.isFinite() ? utilizationRate : BigNumber(0);\n let supplyApr = BigNumber(borrowApr)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - parsedMarketPoolData.reserveFactor);\n supplyApr = supplyApr.isFinite() ? supplyApr : BigNumber(0);\n let conversionRate = supplyAmount.dividedBy(\n parsedMarketPoolData.marketCoinSupplyAmount\n );\n conversionRate =\n conversionRate.isFinite() && !conversionRate.isNaN()\n ? conversionRate\n : BigNumber(1);\n\n return {\n baseBorrowApr,\n baseBorrowApy: utils.parseAprToApy(baseBorrowApr),\n borrowAprOnHighKink,\n borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),\n borrowAprOnMidKink,\n borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),\n maxBorrowApr,\n maxBorrowApy: utils.parseAprToApy(maxBorrowApr),\n borrowApr: Math.min(borrowApr, maxBorrowApr),\n borrowApy: Math.min(\n utils.parseAprToApy(borrowApr),\n utils.parseAprToApy(maxBorrowApr)\n ),\n borrowIndex: currentBorrowIndex.toNumber(),\n growthInterest: growthInterest.toNumber(),\n supplyAmount: supplyAmount.toNumber(),\n supplyCoin: supplyCoin.toNumber(),\n borrowAmount: borrowAmount.toNumber(),\n borrowCoin: borrowCoin.toNumber(),\n reserveAmount: reserveAmount.toNumber(),\n reserveCoin: reserveCoin.toNumber(),\n utilizationRate: utilizationRate.toNumber(),\n supplyApr: supplyApr.toNumber(),\n supplyApy: utils.parseAprToApy(supplyApr.toNumber()),\n conversionRate: conversionRate.toNumber(),\n };\n};\n\n/**\n * Parse origin market collateral data to a more readable format.\n *\n * @param originMarketCollateralData - Origin market collateral data\n * @return Parsed market collateral data\n */\nexport const parseOriginMarketCollateralData = (\n originMarketCollateralData: OriginMarketCollateralData\n): ParsedMarketCollateralData => {\n return {\n coinType: normalizeStructTag(originMarketCollateralData.type.name),\n collateralFactor:\n Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,\n liquidationFactor:\n Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,\n liquidationDiscount:\n Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,\n liquidationPanelty:\n Number(originMarketCollateralData.liquidationPanelty.value) / 2 ** 32,\n liquidationReserveFactor:\n Number(originMarketCollateralData.liquidationReserveFactor.value) /\n 2 ** 32,\n maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),\n totalCollateralAmount: Number(\n originMarketCollateralData.totalCollateralAmount\n ),\n };\n};\n\nexport const calculateMarketCollateralData = (\n utils: ScallopUtils,\n parsedMarketCollateralData: ParsedMarketCollateralData\n): CalculatedMarketCollateralData => {\n const collateralCoinName =\n utils.parseCoinNameFromType<SupportCollateralCoins>(\n parsedMarketCollateralData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(collateralCoinName);\n\n const maxCollateralCoin = BigNumber(\n parsedMarketCollateralData.maxCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n const depositCoin = BigNumber(\n parsedMarketCollateralData.totalCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n\n return {\n maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,\n maxDepositCoin: maxCollateralCoin.toNumber(),\n depositAmount: parsedMarketCollateralData.totalCollateralAmount,\n depositCoin: depositCoin.toNumber(),\n };\n};\n\n/**\n * Parse origin spool data to a more readable format.\n *\n * @param originSpoolData - Origin spool data\n * @return Parsed spool data\n */\nexport const parseOriginSpoolData = (\n originSpoolData: OriginSpoolData\n): ParsedSpoolData => {\n return {\n stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),\n maxPoint: Number(originSpoolData.maxDistributedPoint),\n distributedPoint: Number(originSpoolData.distributedPoint),\n pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),\n period: Number(originSpoolData.pointDistributionTime),\n maxStake: Number(originSpoolData.maxStake),\n staked: Number(originSpoolData.stakes),\n index: Number(originSpoolData.index),\n createdAt: Number(originSpoolData.createdAt),\n lastUpdate: Number(originSpoolData.lastUpdate),\n };\n};\n\nexport const calculateSpoolData = (\n parsedSpoolData: ParsedSpoolData,\n stakeMarketCoinPrice: number,\n stakeMarketCoinDecimal: number\n): CalculatedSpoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedSpoolData.pointPerPeriod\n ).dividedBy(parsedSpoolData.period);\n\n const pointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(\n parsedSpoolData.period\n );\n const remainingPeriod = BigNumber(parsedSpoolData.maxPoint)\n .minus(parsedSpoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedSpoolData.createdAt;\n const endDate = remainingPeriod\n .plus(parsedSpoolData.lastUpdate)\n .integerValue()\n .toNumber();\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) - parsedSpoolData.lastUpdate\n )\n .dividedBy(parsedSpoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(parsedSpoolData.maxPoint).minus(\n parsedSpoolData.distributedPoint\n );\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),\n remainingPoints\n );\n\n const currentPointIndex = BigNumber(parsedSpoolData.index).plus(\n accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedSpoolData.staked)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedSpoolData.distributedPoint\n ).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedSpoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin spool reward pool data to a more readable format.\n *\n * @param originRewardPoolData - Origin reward pool data\n * @return Parsed spool reward pool data\n */\nexport const parseOriginSpoolRewardPoolData = (\n originSpoolRewardPoolData: OriginSpoolRewardPoolData\n): ParsedSpoolRewardPoolData => {\n return {\n claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),\n exchangeRateDenominator: Number(\n originSpoolRewardPoolData.exchange_rate_denominator\n ),\n exchangeRateNumerator: Number(\n originSpoolRewardPoolData.exchange_rate_numerator\n ),\n feeRateDenominator: Number(originSpoolRewardPoolData.fee_rate_denominator),\n feeRateNumerator: Number(originSpoolRewardPoolData.fee_rate_numerator),\n rewards: Number(originSpoolRewardPoolData.rewards),\n spoolId: String(originSpoolRewardPoolData.spool_id),\n };\n};\n\nexport const calculateSpoolRewardPoolData = (\n parsedSpoolData: ParsedSpoolData,\n parsedSpoolRewardPoolData: ParsedSpoolRewardPoolData,\n calculatedSpoolData: CalculatedSpoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number\n): CalculatedSpoolRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(calculatedSpoolData.distributedPointPerSec)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedSpoolData.maxPoint)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(parsedSpoolRewardPoolData.rewards);\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(\n parsedSpoolRewardPoolData.claimedRewards\n );\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n const rewardRate = rewardValueForYear\n .dividedBy(calculatedSpoolData.stakedValue)\n .isFinite()\n ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber()\n : Infinity;\n const rewardFeeRate = BigNumber(parsedSpoolRewardPoolData.feeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.feeRateDenominator)\n .toNumber();\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n rewardFee: rewardFeeRate,\n };\n};\n\n/**\n * Parse origin borrow incentive pool data to a more readable format.\n *\n * @param originBorrowIncentivePoolData - Origin borrow incentive pool data\n * @return Parsed borrow incentive pool data\n */\nexport const parseOriginBorrowIncentivePoolData = (\n originBorrowIncentivePoolData: OriginBorrowIncentivePoolData\n): ParsedBorrowIncentivePoolData => {\n return {\n poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),\n maxPoint: Number(originBorrowIncentivePoolData.max_distributed_point),\n distributedPoint: Number(originBorrowIncentivePoolData.distributed_point),\n pointPerPeriod: Number(\n originBorrowIncentivePoolData.distributed_point_per_period\n ),\n period: Number(originBorrowIncentivePoolData.point_distribution_time),\n maxStake: Number(originBorrowIncentivePoolData.max_stakes),\n staked: Number(originBorrowIncentivePoolData.stakes),\n index: Number(originBorrowIncentivePoolData.index),\n createdAt: Number(originBorrowIncentivePoolData.created_at),\n lastUpdate: Number(originBorrowIncentivePoolData.last_update),\n };\n};\n\nexport const calculateBorrowIncentivePoolData = (\n parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,\n borrowIncentiveCoinPrice: number,\n borrowIncentiveCoinDecimal: number\n): CalculatedBorrowIncentivePoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ).dividedBy(parsedBorrowIncentivePoolData.period);\n\n const pointPerSec = BigNumber(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ).dividedBy(parsedBorrowIncentivePoolData.period);\n const remainingPeriod = BigNumber(parsedBorrowIncentivePoolData.maxPoint)\n .minus(parsedBorrowIncentivePoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedBorrowIncentivePoolData.createdAt;\n const endDate = remainingPeriod\n .plus(parsedBorrowIncentivePoolData.lastUpdate)\n .integerValue()\n .toNumber();\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) -\n parsedBorrowIncentivePoolData.lastUpdate\n )\n .dividedBy(parsedBorrowIncentivePoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(\n parsedBorrowIncentivePoolData.maxPoint\n ).minus(parsedBorrowIncentivePoolData.distributedPoint);\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ),\n remainingPoints\n );\n\n const currentPointIndex = BigNumber(parsedBorrowIncentivePoolData.index).plus(\n accumulatedPoints.dividedBy(parsedBorrowIncentivePoolData.staked).isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedBorrowIncentivePoolData.staked)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedBorrowIncentivePoolData.distributedPoint\n ).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedBorrowIncentivePoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * borrowIncentiveCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(borrowIncentiveCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin borrow incentive reward pool data to a more readable format.\n *\n * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data\n * @return Parsed borrow incentive reward pool data\n */\nexport const parseOriginBorrowIncentiveRewardPoolData = (\n originBorrowIncentiveRewardPoolData: OriginBorrowIncentiveRewardPoolData\n): ParsedBorrowIncentiveRewardPoolData => {\n return {\n rewardType: normalizeStructTag(\n originBorrowIncentiveRewardPoolData.reward_type.name\n ),\n claimedRewards: Number(originBorrowIncentiveRewardPoolData.claimed_rewards),\n exchangeRateNumerator: Number(\n originBorrowIncentiveRewardPoolData.exchange_rate_numerator\n ),\n exchangeRateDenominator: Number(\n originBorrowIncentiveRewardPoolData.exchange_rate_denominator\n ),\n rewardsFeeRateNumerator: Number(\n originBorrowIncentiveRewardPoolData.rewards_fee_rate_numerator\n ),\n rewardsFeeRateDenominator: Number(\n originBorrowIncentiveRewardPoolData.rewards_fee_rate_denominator\n ),\n remainingRewards: Number(\n originBorrowIncentiveRewardPoolData.remaining_reward\n ),\n };\n};\n\nexport const calculateBorrowIncentiveRewardPoolData = (\n parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,\n parsedBorrowIncentiveRewardPoolData: ParsedBorrowIncentiveRewardPoolData,\n calculatedBorrowIncentivePoolData: CalculatedBorrowIncentivePoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number\n): CalculatedBorrowIncentiveRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(\n calculatedBorrowIncentivePoolData.distributedPointPerSec\n )\n .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedBorrowIncentivePoolData.maxPoint)\n .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(\n parsedBorrowIncentiveRewardPoolData.remainingRewards\n );\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(\n parsedBorrowIncentiveRewardPoolData.claimedRewards\n );\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n const rewardRate = rewardValueForYear\n .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)\n .isFinite()\n ? rewardValueForYear\n .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)\n .toNumber()\n : Infinity;\n const rewardFeeRate = BigNumber(\n parsedBorrowIncentiveRewardPoolData.rewardsFeeRateNumerator\n )\n .dividedBy(parsedBorrowIncentiveRewardPoolData.rewardsFeeRateDenominator)\n .toNumber();\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n rewardFee: rewardFeeRate,\n };\n};\n\n/**\n * Parse origin borrow incentive account data to a more readable format.\n *\n * @param originBorrowIncentiveAccountData - Origin borrow incentive account data\n * @return Parsed borrow incentive account data\n */\nexport const parseOriginBorrowIncentiveAccountData = (\n originBorrowIncentiveAccountData: OriginBorrowIncentiveAccountData\n): ParsedBorrowIncentiveAccountData => {\n return {\n poolType: normalizeStructTag(\n originBorrowIncentiveAccountData.pool_type.name\n ),\n amount: Number(originBorrowIncentiveAccountData.amount),\n index: Number(originBorrowIncentiveAccountData.index),\n points: Number(originBorrowIncentiveAccountData.points),\n totalPoints: Number(originBorrowIncentiveAccountData.total_points),\n };\n};\n\nexport const minBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((min, current) =>\n new BigNumber(current).lt(min) ? current : min\n )\n );\n};\n\nexport const maxBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((max, current) =>\n new BigNumber(current).gt(max) ? current : max\n )\n );\n};\n\n/**\n * Dynamically adjust the decrease or increase ratio according to the amout\n * @param amount - The amount required to calculate factor.\n * @param scaleStep - The scale step required to determine the factor..\n * @param type - The type of the calculation.\n * @return The estimated factor\n * */\nexport const estimatedFactor = (\n amount: number,\n scaleStep: number,\n type: 'increase' | 'decrease'\n) => {\n const amountOfDigits = Math.max(\n 1,\n Math.floor(Math.log10(Math.abs(amount)) + 1)\n );\n\n const adjustScale =\n Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;\n\n let adjustFactor = Math.pow(10, -adjustScale);\n adjustFactor = type === 'increase' ? 1 - adjustFactor : 1 + adjustFactor;\n\n return adjustFactor;\n};\n","import type { PriceFeed } from '@pythnetwork/pyth-sui-js';\nimport {\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n SUPPORT_SPOOLS_REWARDS,\n} from '../constants';\nimport type { ScallopAddress } from '../models';\nimport type {\n SupportAssetCoins,\n SupportCoins,\n SupportMarketCoins,\n} from '../types';\n\nexport const isMarketCoin = (\n coinName: SupportCoins\n): coinName is SupportMarketCoins => {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return (\n coinName.charAt(0).toLowerCase() === 's' &&\n [\n ...new Set([\n ...SUPPORT_POOLS,\n ...SUPPORT_COLLATERALS,\n ...SUPPORT_SPOOLS_REWARDS,\n ]),\n ].includes(assetCoinName)\n );\n};\n\nexport const parseAssetSymbol = (coinName: SupportAssetCoins): string => {\n switch (coinName) {\n case 'afsui':\n return 'afSUI';\n case 'hasui':\n return 'haSUI';\n case 'vsui':\n return 'vSUI';\n default:\n return coinName.toUpperCase();\n }\n};\n\n/**\n * Parse price from pyth price feed.\n *\n * @param feed - Price feed object from pyth.\n * @param address - Scallop address instance.\n * @return Price Data inclue coin name, price, and publish time.\n */\nexport const parseDataFromPythPriceFeed = (\n feed: PriceFeed,\n address: ScallopAddress\n) => {\n const assetCoinNames = [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ] as SupportAssetCoins[];\n const assetCoinName = assetCoinNames.find((assetCoinName) => {\n return (\n address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`) === feed.id\n );\n });\n if (assetCoinName) {\n const price = feed.price.price * 10 ** feed.price.expo;\n\n return {\n coinName: assetCoinName,\n price,\n publishTime: Number(feed.price.publishTime) * 10 ** 3,\n };\n } else {\n throw new Error('Invalid feed id');\n }\n};\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SUPPORT_SPOOLS } from '../constants';\nimport {\n parseOriginSpoolData,\n calculateSpoolData,\n parseOriginSpoolRewardPoolData,\n calculateSpoolRewardPoolData,\n isMarketCoin,\n} from '../utils';\nimport type { SuiObjectResponse } from '@mysten/sui.js/client';\nimport type { ScallopQuery } from '../models';\nimport type {\n MarketPool,\n Spools,\n Spool,\n StakePool,\n StakeRewardPool,\n StakeAccounts,\n SupportStakeMarketCoins,\n SupportStakeCoins,\n} from '../types';\n\n/**\n * Get spools data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support stake market coin name.\n * @return Spools data.\n */\nexport const getSpools = async (\n query: ScallopQuery,\n stakeMarketCoinNames?: SupportStakeMarketCoins[]\n) => {\n stakeMarketCoinNames = stakeMarketCoinNames || [...SUPPORT_SPOOLS];\n const stakeCoinNames = stakeMarketCoinNames.map((stakeMarketCoinName) =>\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName)\n );\n const marketPool = await query.getMarketPools(stakeCoinNames);\n const spools: Spools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakeCoinName =\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const spool = await getSpool(\n query,\n stakeMarketCoinName,\n marketPool[stakeCoinName]\n );\n\n if (spool) {\n spools[stakeMarketCoinName] = spool;\n }\n }\n\n return spools;\n};\n\n/**\n * Get spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @param marketPool - The market pool data.\n * @return Spool data.\n */\nexport const getSpool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins,\n marketPool?: MarketPool\n) => {\n const coinName = query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);\n marketPool = marketPool || (await query.getMarketPool(coinName));\n const spoolPkgId = query.address.get(`spool.id`);\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n const rewardPoolId = query.address.get(\n `spool.pools.${marketCoinName}.rewardPoolId`\n );\n let spool: Spool | undefined = undefined;\n const spoolObjectResponse = await query.suiKit.client().multiGetObjects({\n ids: [poolId, rewardPoolId],\n options: {\n showContent: true,\n },\n });\n const spoolRewardFeeDynamicFieldsResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: rewardPoolId,\n name: {\n type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,\n value: { dummy_field: false },\n },\n });\n\n if (\n marketPool &&\n spoolObjectResponse[0].data &&\n spoolObjectResponse[1].data\n ) {\n const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);\n const coinPrices = await query.utils.getCoinPrices([\n coinName,\n rewardCoinName,\n ]);\n\n const spoolObject = spoolObjectResponse[0].data;\n const rewardPoolObject = spoolObjectResponse[1].data;\n const rewardFeeObject = spoolRewardFeeDynamicFieldsResponse.data;\n if (spoolObject.content && 'fields' in spoolObject.content) {\n const spoolFields = spoolObject.content.fields as any;\n const parsedSpoolData = parseOriginSpoolData({\n stakeType: spoolFields.stake_type,\n maxDistributedPoint: spoolFields.max_distributed_point,\n distributedPoint: spoolFields.distributed_point,\n distributedPointPerPeriod: spoolFields.distributed_point_per_period,\n pointDistributionTime: spoolFields.point_distribution_time,\n maxStake: spoolFields.max_stakes,\n stakes: spoolFields.stakes,\n index: spoolFields.index,\n createdAt: spoolFields.created_at,\n lastUpdate: spoolFields.last_update,\n });\n\n const marketCoinPrice =\n (coinPrices?.[coinName] ?? 0) * marketPool.conversionRate;\n const marketCoinDecimal = query.utils.getCoinDecimal(marketCoinName);\n const calculatedSpoolData = calculateSpoolData(\n parsedSpoolData,\n marketCoinPrice,\n marketCoinDecimal\n );\n\n if (\n rewardPoolObject.content &&\n rewardFeeObject?.content &&\n 'fields' in rewardPoolObject.content &&\n 'fields' in rewardFeeObject.content\n ) {\n const rewardPoolFields = rewardPoolObject.content.fields as any;\n const rewardFeeFields = (rewardFeeObject.content.fields as any).value\n .fields;\n const parsedSpoolRewardPoolData = parseOriginSpoolRewardPoolData({\n claimed_rewards: rewardPoolFields.claimed_rewards,\n exchange_rate_numerator: rewardPoolFields.exchange_rate_numerator,\n exchange_rate_denominator: rewardPoolFields.exchange_rate_denominator,\n fee_rate_numerator: rewardFeeFields.fee_rate_numerator,\n fee_rate_denominator: rewardFeeFields.fee_rate_denominator,\n rewards: rewardPoolFields.rewards,\n spool_id: rewardPoolFields.spool_id,\n });\n\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n\n const calculatedRewardPoolData = calculateSpoolRewardPoolData(\n parsedSpoolData,\n parsedSpoolRewardPoolData,\n calculatedSpoolData,\n rewardCoinPrice,\n rewardCoinDecimal\n );\n\n spool = {\n marketCoinName: marketCoinName,\n symbol: query.utils.parseSymbol(marketCoinName),\n coinType: query.utils.parseCoinType(coinName),\n marketCoinType: query.utils.parseMarketCoinType(coinName),\n rewardCoinType: isMarketCoin(rewardCoinName)\n ? query.utils.parseMarketCoinType(rewardCoinName)\n : query.utils.parseCoinType(rewardCoinName),\n coinDecimal: query.utils.getCoinDecimal(coinName),\n rewardCoinDecimal: query.utils.getCoinDecimal(rewardCoinName),\n coinPrice: coinPrices?.[coinName] ?? 0,\n marketCoinPrice: marketCoinPrice,\n rewardCoinPrice: rewardCoinPrice,\n maxPoint: parsedSpoolData.maxPoint,\n distributedPoint: parsedSpoolData.distributedPoint,\n maxStake: parsedSpoolData.maxStake,\n ...calculatedSpoolData,\n exchangeRateNumerator:\n parsedSpoolRewardPoolData.exchangeRateNumerator,\n exchangeRateDenominator:\n parsedSpoolRewardPoolData.exchangeRateDenominator,\n ...calculatedRewardPoolData,\n };\n }\n }\n }\n\n return spool;\n};\n\n/**\n * Get all stake accounts of the owner.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - Owner address.\n * @return Stake accounts.\n */\nexport const getStakeAccounts = async (\n query: ScallopQuery,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const spoolObjectId = query.address.get('spool.object');\n const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;\n const stakeObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedStakeObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: stakeAccountType },\n options: {\n showContent: true,\n showType: true,\n },\n cursor: nextCursor,\n });\n stakeObjectsResponse.push(...paginatedStakeObjectsResponse.data);\n if (\n paginatedStakeObjectsResponse.hasNextPage &&\n paginatedStakeObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedStakeObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const stakeAccounts: StakeAccounts = {\n ssui: [],\n susdc: [],\n susdt: [],\n };\n\n const stakeMarketCoinTypes: Record<SupportStakeMarketCoins, string> =\n Object.keys(stakeAccounts).reduce(\n (types, stakeMarketCoinName) => {\n const stakeCoinName =\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const marketCoinType = query.utils.parseMarketCoinType(stakeCoinName);\n\n types[\n stakeMarketCoinName as SupportStakeMarketCoins\n ] = `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;\n return types;\n },\n {} as Record<SupportStakeMarketCoins, string>\n );\n\n const stakeObjectIds: string[] = stakeObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const stakeObjects = await query.suiKit.getObjects(stakeObjectIds);\n for (const stakeObject of stakeObjects) {\n const id = stakeObject.objectId;\n const type = stakeObject.type!;\n if (stakeObject.content && 'fields' in stakeObject.content) {\n const fields = stakeObject.content.fields as any;\n const stakePoolId = String(fields.spool_id);\n const stakeType = String(fields.stake_type.fields.name);\n const staked = Number(fields.stakes);\n const index = Number(fields.index);\n const points = Number(fields.points);\n const totalPoints = Number(fields.total_points);\n if (normalizeStructTag(type) === stakeMarketCoinTypes.ssui) {\n stakeAccounts.ssui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdc) {\n stakeAccounts.susdc.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdt) {\n stakeAccounts.susdt.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n }\n }\n }\n return stakeAccounts;\n};\n\n/**\n * Get stake pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get stake pool info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\nexport const getStakePool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins\n) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n let stakePool: StakePool | undefined = undefined;\n const stakePoolObjectResponse = await query.suiKit.client().getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakePoolObjectResponse.data) {\n const stakePoolObject = stakePoolObjectResponse.data;\n const id = stakePoolObject.objectId;\n const type = stakePoolObject.type!;\n if (stakePoolObject.content && 'fields' in stakePoolObject.content) {\n const fields = stakePoolObject.content.fields as any;\n const maxPoint = Number(fields.max_distributed_point);\n const distributedPoint = Number(fields.distributed_point);\n const pointPerPeriod = Number(fields.distributed_point_per_period);\n const period = Number(fields.point_distribution_time);\n const maxStake = Number(fields.max_stakes);\n const stakeType = String(fields.stake_type.fields.name);\n const totalStaked = Number(fields.stakes);\n const index = Number(fields.index);\n const createdAt = Number(fields.created_at);\n const lastUpdate = Number(fields.last_update);\n stakePool = {\n id,\n type: normalizeStructTag(type),\n maxPoint,\n distributedPoint,\n pointPerPeriod,\n period,\n maxStake,\n stakeType: normalizeStructTag(stakeType),\n totalStaked,\n index,\n createdAt,\n lastUpdate,\n };\n }\n }\n return stakePool;\n};\n\n/**\n * Get stake reward pool of the owner.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get reward info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool.\n */\nexport const getStakeRewardPool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins\n) => {\n const spoolPkgId = query.address.get('spool.id');\n const poolId = query.address.get(\n `spool.pools.${marketCoinName}.rewardPoolId`\n );\n let stakeRewardPool: StakeRewardPool | undefined = undefined;\n const stakeRewardPoolObjectResponse = await query.suiKit.client().getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n const stakeRewardFeeDynamicFieldsResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: poolId,\n name: {\n type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,\n value: { dummy_field: false },\n },\n });\n if (\n stakeRewardPoolObjectResponse.data &&\n stakeRewardFeeDynamicFieldsResponse.data\n ) {\n const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;\n const stakeRewardFeeDynamicFieldObject =\n stakeRewardFeeDynamicFieldsResponse.data;\n const id = stakeRewardPoolObject.objectId;\n const type = stakeRewardPoolObject.type!;\n if (\n stakeRewardPoolObject.content &&\n stakeRewardFeeDynamicFieldObject.content &&\n 'fields' in stakeRewardPoolObject.content &&\n 'fields' in stakeRewardFeeDynamicFieldObject.content\n ) {\n const rewardPoolFields = stakeRewardPoolObject.content.fields as any;\n const rewardFeeFields = (\n stakeRewardFeeDynamicFieldObject.content.fields as any\n ).value.fields;\n const stakePoolId = String(rewardPoolFields.spool_id);\n const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);\n const ratioDenominator = Number(\n rewardPoolFields.exchange_rate_denominator\n );\n const rewards = Number(rewardPoolFields.rewards);\n const claimedRewards = Number(rewardPoolFields.claimed_rewards);\n const feeRateNumerator = Number(rewardFeeFields.fee_rate_numerator);\n const feeRateDenominator = Number(rewardFeeFields.fee_rate_denominator);\n\n stakeRewardPool = {\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n ratioNumerator,\n ratioDenominator,\n feeRateNumerator,\n feeRateDenominator,\n rewards,\n claimedRewards,\n };\n }\n }\n return stakeRewardPool;\n};\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport {\n parseOriginBorrowIncentivePoolData,\n calculateBorrowIncentivePoolData,\n parseOriginBorrowIncentiveRewardPoolData,\n calculateBorrowIncentiveRewardPoolData,\n parseOriginBorrowIncentiveAccountData,\n} from '../utils';\nimport type { ScallopQuery } from '../models';\nimport type {\n BorrowIncentivePoolsQueryInterface,\n BorrowIncentivePools,\n BorrowIncentiveAccountsQueryInterface,\n BorrowIncentiveAccounts,\n SupportBorrowIncentiveCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * Query borrow incentive pools data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive pools data.\n */\nexport const queryBorrowIncentivePools = async (\n query: ScallopQuery,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[]\n) => {\n borrowIncentiveCoinNames = borrowIncentiveCoinNames || [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentivePoolsId = query.address.get('borrowIncentive.incentivePools');\n const txBlock = new SuiKitTxBlock();\n const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data`;\n // The reward coin type currently only support sui, so bring it in directly here.\n txBlock.moveCall(queryTarget, [incentivePoolsId], ['0x2::sui::SUI']);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const borrowIncentivePoolsQueryData = queryResult.events[0]\n .parsedJson as BorrowIncentivePoolsQueryInterface;\n\n const parsedBorrowIncentiveRewardPoolData =\n parseOriginBorrowIncentiveRewardPoolData(\n borrowIncentivePoolsQueryData.reward_pool\n );\n const rewardCoinType = parsedBorrowIncentiveRewardPoolData.rewardType;\n\n const borrowIncentivePools: BorrowIncentivePools = {};\n for (const pool of borrowIncentivePoolsQueryData.incentive_pools) {\n const coinType = normalizeStructTag(pool.pool_type.name);\n const coinName =\n query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(coinType);\n const rewardCoinName =\n query.utils.parseCoinNameFromType<SupportAssetCoins>(rewardCoinType);\n\n // Filter pools not yet supported by the SDK.\n if (!borrowIncentiveCoinNames.includes(coinName)) {\n continue;\n }\n\n const coinPrices = await query.utils.getCoinPrices([\n coinName,\n rewardCoinName,\n ]);\n\n const parsedBorrowIncentivePoolData =\n parseOriginBorrowIncentivePoolData(pool);\n\n const coinPrice = coinPrices?.[coinName] ?? 0;\n const coinDecimal = query.utils.getCoinDecimal(coinName);\n const calculatedBorrowIncentivePoolData = calculateBorrowIncentivePoolData(\n parsedBorrowIncentivePoolData,\n coinPrice,\n coinDecimal\n );\n\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n const calculatedBorrowIncentiveRewardPoolData =\n calculateBorrowIncentiveRewardPoolData(\n parsedBorrowIncentivePoolData,\n parsedBorrowIncentiveRewardPoolData,\n calculatedBorrowIncentivePoolData,\n rewardCoinPrice,\n rewardCoinDecimal\n );\n\n borrowIncentivePools[coinName] = {\n coinName: coinName,\n symbol: query.utils.parseSymbol(coinName),\n coinType: coinType,\n rewardCoinType: rewardCoinType,\n coinDecimal: coinDecimal,\n rewardCoinDecimal: rewardCoinDecimal,\n coinPrice: coinPrice,\n rewardCoinPrice: rewardCoinPrice,\n maxPoint: parsedBorrowIncentivePoolData.maxPoint,\n distributedPoint: parsedBorrowIncentivePoolData.distributedPoint,\n maxStake: parsedBorrowIncentivePoolData.maxStake,\n ...calculatedBorrowIncentivePoolData,\n exchangeRateNumerator:\n parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator,\n exchangeRateDenominator:\n parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator,\n ...calculatedBorrowIncentiveRewardPoolData,\n };\n }\n\n return borrowIncentivePools;\n};\n\n/**\n * Query borrow incentive accounts data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive accounts data.\n */\nexport const queryBorrowIncentiveAccounts = async (\n query: ScallopQuery,\n obligationId: string,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[]\n) => {\n borrowIncentiveCoinNames = borrowIncentiveCoinNames || [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentiveAccountsId = query.address.get(\n 'borrowIncentive.incentiveAccounts'\n );\n const queryTarget = `${queryPkgId}::incentive_account_query::incentive_account_data`;\n const txBlock = new SuiKitTxBlock();\n txBlock.moveCall(queryTarget, [incentiveAccountsId, obligationId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const borrowIncentiveAccountsQueryData = queryResult.events[0]\n .parsedJson as BorrowIncentiveAccountsQueryInterface;\n\n const borrowIncentiveAccounts: BorrowIncentiveAccounts = Object.values(\n borrowIncentiveAccountsQueryData.incentive_states\n ).reduce((accounts, accountData) => {\n const parsedBorrowIncentiveAccount =\n parseOriginBorrowIncentiveAccountData(accountData);\n const poolType = parsedBorrowIncentiveAccount.poolType;\n const coinName =\n query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolType);\n\n if (\n borrowIncentiveCoinNames &&\n borrowIncentiveCoinNames.includes(coinName)\n ) {\n accounts[coinName] = {\n poolType: poolType,\n amount: parsedBorrowIncentiveAccount.amount,\n points: parsedBorrowIncentiveAccount.points,\n totalPoints: parsedBorrowIncentiveAccount.totalPoints,\n index: parsedBorrowIncentiveAccount.index,\n };\n }\n\n return accounts;\n }, {} as BorrowIncentiveAccounts);\n\n return borrowIncentiveAccounts;\n};\n","import type { ScallopQuery } from '../models';\nimport type { SupportAssetCoins } from '../types';\n\n/**\n * Get price from pyth fee object.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\nexport const getPythPrice = async (\n query: ScallopQuery,\n assetCoinName: SupportAssetCoins\n) => {\n const pythFeedObjectId = query.address.get(\n `core.coins.${assetCoinName}.oracle.pyth.feedObject`\n );\n const priceFeedObjectResponse = await query.suiKit.client().getObject({\n id: pythFeedObjectId,\n options: {\n showContent: true,\n },\n });\n\n if (priceFeedObjectResponse.data) {\n const priceFeedPoolObject = priceFeedObjectResponse.data;\n if (\n priceFeedPoolObject.content &&\n 'fields' in priceFeedPoolObject.content\n ) {\n const fields = priceFeedPoolObject.content.fields as any;\n const expoMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .magnitude\n );\n const expoNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .negative\n );\n const priceMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .magnitude\n );\n const priceNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .negative\n );\n\n return (\n priceMagnitude *\n 10 ** ((expoNegative ? -1 : 1) * expoMagnitude) *\n (priceNegative ? -1 : 1)\n );\n }\n }\n\n return 0;\n};\n","import BigNumber from 'bignumber.js';\nimport { SUPPORT_POOLS, SUPPORT_SPOOLS } from '../constants';\nimport { minBigNumber, estimatedFactor } from 'src/utils';\nimport type { ScallopQuery } from '../models';\nimport type {\n Market,\n SupportAssetCoins,\n SupportPoolCoins,\n MarketPool,\n Spool,\n StakeAccount,\n Lendings,\n Lending,\n ObligationAccounts,\n ObligationAccount,\n SupportStakeMarketCoins,\n SupportCollateralCoins,\n CoinAmounts,\n CoinPrices,\n SupportMarketCoins,\n TotalValueLocked,\n SupportBorrowIncentiveCoins,\n} from '../types';\n\n/**\n * Get user lending infomation for specific pools.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @return User lending infomation for specific pools.\n */\nexport const getLendings = async (\n query: ScallopQuery,\n poolCoinNames?: SupportPoolCoins[],\n ownerAddress?: string\n) => {\n poolCoinNames = poolCoinNames || [...SUPPORT_POOLS];\n const marketCoinNames = poolCoinNames.map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const stakeMarketCoinNames = marketCoinNames.filter((marketCoinName) =>\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ) as SupportStakeMarketCoins[];\n\n const marketPools = await query.getMarketPools(poolCoinNames);\n const spools = await query.getSpools(stakeMarketCoinNames);\n const coinAmounts = await query.getCoinAmounts(poolCoinNames, ownerAddress);\n const marketCoinAmounts = await query.getMarketCoinAmounts(\n marketCoinNames,\n ownerAddress\n );\n const allStakeAccounts = await query.getAllStakeAccounts(ownerAddress);\n const coinPrices = await query.utils.getCoinPrices(poolCoinNames);\n\n const lendings: Lendings = {};\n for (const poolCoinName of poolCoinNames) {\n const stakeMarketCoinName = stakeMarketCoinNames.find(\n (marketCoinName) =>\n marketCoinName === query.utils.parseMarketCoinName(poolCoinName)\n );\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n lendings[poolCoinName] = await getLending(\n query,\n poolCoinName,\n ownerAddress,\n marketPools?.[poolCoinName],\n stakeMarketCoinName ? spools[stakeMarketCoinName] : undefined,\n stakeMarketCoinName ? allStakeAccounts[stakeMarketCoinName] : undefined,\n coinAmounts?.[poolCoinName],\n marketCoinAmounts?.[marketCoinName],\n coinPrices?.[poolCoinName] ?? 0\n );\n }\n\n return lendings;\n};\n\n/**\n * Get user lending infomation for specific pool.\n *\n * @description\n * The lending information includes the spool information extended by it.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinName - Specific support coin name.\n * @param ownerAddress - The owner address.\n * @param marketPool - The market pool data.\n * @param spool - The spool data.\n * @param stakeAccounts - The stake accounts data.\n * @param coinAmount - The coin amount.\n * @param marketCoinAmount - The market coin amount.\n * @return User lending infomation for specific pool.\n */\nexport const getLending = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n ownerAddress?: string,\n marketPool?: MarketPool,\n spool?: Spool,\n stakeAccounts?: StakeAccount[],\n coinAmount?: number,\n marketCoinAmount?: number,\n coinPrice?: number\n) => {\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n marketPool = marketPool || (await query.getMarketPool(poolCoinName));\n spool =\n spool ||\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ? await query.getSpool(marketCoinName as SupportStakeMarketCoins)\n : undefined;\n stakeAccounts =\n stakeAccounts ||\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ? await query.getStakeAccounts(\n marketCoinName as SupportStakeMarketCoins,\n ownerAddress\n )\n : [];\n coinAmount =\n coinAmount || (await query.getCoinAmount(poolCoinName, ownerAddress));\n marketCoinAmount =\n marketCoinAmount ||\n (await query.getMarketCoinAmount(marketCoinName, ownerAddress));\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];\n const coinDecimal = query.utils.getCoinDecimal(poolCoinName);\n\n // Handle staked scoin\n let stakedMarketAmount = BigNumber(0);\n let stakedMarketCoin = BigNumber(0);\n let stakedAmount = BigNumber(0);\n let stakedCoin = BigNumber(0);\n let stakedValue = BigNumber(0);\n let availableUnstakeAmount = BigNumber(0);\n let availableUnstakeCoin = BigNumber(0);\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n\n if (spool) {\n for (const stakeAccount of stakeAccounts) {\n const accountStakedMarketCoinAmount = BigNumber(stakeAccount.staked);\n const accountStakedMarketCoin = accountStakedMarketCoinAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedAmount = accountStakedMarketCoinAmount.multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const accountStakedCoin = accountStakedAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedValue = accountStakedCoin.multipliedBy(\n spool.coinPrice\n );\n\n stakedMarketAmount = stakedMarketAmount.plus(\n accountStakedMarketCoinAmount\n );\n stakedMarketCoin = stakedMarketCoin.plus(accountStakedMarketCoin);\n stakedAmount = stakedAmount.plus(accountStakedAmount);\n stakedCoin = stakedCoin.plus(accountStakedCoin);\n stakedValue = stakedValue.plus(accountStakedValue);\n availableUnstakeAmount = availableUnstakeAmount.plus(\n accountStakedMarketCoinAmount\n );\n availableUnstakeCoin = availableUnstakeAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = spool?.currentPointIndex\n ? BigNumber(spool.currentPointIndex - stakeAccount.index).dividedBy(\n baseIndexRate\n )\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountStakedMarketCoinAmount\n .multipliedBy(increasedPointRate)\n .plus(stakeAccount.points)\n .multipliedBy(spool.exchangeRateNumerator)\n .dividedBy(spool.exchangeRateDenominator)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * spool.rewardCoinDecimal\n );\n }\n }\n\n // Handle supplied coin\n const suppliedAmount = BigNumber(marketCoinAmount).multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const suppliedCoin = suppliedAmount.shiftedBy(-1 * coinDecimal);\n const suppliedValue = suppliedCoin.multipliedBy(coinPrice ?? 0);\n\n const unstakedMarketAmount = BigNumber(marketCoinAmount);\n const unstakedMarketCoin = unstakedMarketAmount.shiftedBy(-1 * coinDecimal);\n\n const availableSupplyAmount = BigNumber(coinAmount);\n const availableSupplyCoin = availableSupplyAmount.shiftedBy(-1 * coinDecimal);\n const availableWithdrawAmount = minBigNumber(\n suppliedAmount,\n marketPool?.supplyAmount ?? Infinity\n ).plus(stakedAmount);\n const availableWithdrawCoin = minBigNumber(\n suppliedCoin,\n marketPool?.supplyCoin ?? Infinity\n ).plus(stakedCoin);\n\n const lending: Lending = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice ?? 0,\n supplyApr: marketPool?.supplyApr ?? 0,\n supplyApy: marketPool?.supplyApy ?? 0,\n rewardApr: spool?.rewardApr ?? 0,\n suppliedAmount: suppliedAmount.plus(stakedAmount).toNumber(),\n suppliedCoin: suppliedCoin.plus(stakedCoin).toNumber(),\n suppliedValue: suppliedValue.plus(stakedValue).toNumber(),\n stakedMarketAmount: stakedMarketAmount.toNumber(),\n stakedMarketCoin: stakedMarketCoin.toNumber(),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n unstakedMarketAmount: unstakedMarketAmount.toNumber(),\n unstakedMarketCoin: unstakedMarketCoin.toNumber(),\n unstakedAmount: suppliedAmount.toNumber(),\n unstakedCoin: suppliedCoin.toNumber(),\n unstakedValue: suppliedValue.toNumber(),\n availableSupplyAmount: availableSupplyAmount.toNumber(),\n availableSupplyCoin: availableSupplyCoin.toNumber(),\n availableWithdrawAmount: availableWithdrawAmount.toNumber(),\n availableWithdrawCoin: availableWithdrawCoin.toNumber(),\n availableStakeAmount: unstakedMarketAmount.toNumber(),\n availableStakeCoin: unstakedMarketCoin.toNumber(),\n availableUnstakeAmount: availableUnstakeAmount.toNumber(),\n availableUnstakeCoin: availableUnstakeCoin.toNumber(),\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n };\n\n return lending;\n};\n\n/**\n * Get all obligation accounts data.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return All obligation accounts data.\n */\nexport const getObligationAccounts = async (\n query: ScallopQuery,\n ownerAddress?: string\n) => {\n const market = await query.queryMarket();\n const coinPrices = await query.utils.getCoinPrices();\n const coinAmounts = await query.getCoinAmounts(undefined, ownerAddress);\n const obligations = await query.getObligations(ownerAddress);\n\n const obligationAccounts: ObligationAccounts = {};\n for (const obligation of obligations) {\n obligationAccounts[obligation.keyId] = await getObligationAccount(\n query,\n obligation.id,\n ownerAddress,\n market,\n coinPrices,\n coinAmounts\n );\n }\n\n return obligationAccounts;\n};\n\n/**\n * Get obligation account data.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation account data.\n */\nexport const getObligationAccount = async (\n query: ScallopQuery,\n obligationId: string,\n ownerAddress?: string,\n market?: Market,\n coinPrices?: CoinPrices,\n coinAmounts?: CoinAmounts\n) => {\n market = market || (await query.queryMarket());\n const assetCoinNames: SupportAssetCoins[] = [\n ...new Set([\n ...Object.values(market.pools).map((pool) => pool.coinName),\n ...Object.values(market.collaterals).map(\n (collateral) => collateral.coinName\n ),\n ]),\n ];\n const obligationQuery = await query.queryObligation(obligationId);\n const borrowIncentivePools = await query.getBorrowIncentivePools();\n const borrowIncentiveAccounts =\n await query.getBorrowIncentiveAccounts(obligationId);\n coinPrices = coinPrices || (await query.utils.getCoinPrices(assetCoinNames));\n coinAmounts =\n coinAmounts || (await query.getCoinAmounts(assetCoinNames, ownerAddress));\n\n const collaterals: ObligationAccount['collaterals'] = {};\n const debts: ObligationAccount['debts'] = {};\n const borrowIncentives: ObligationAccount['borrowIncentives'] = {};\n let totalDepositedPools = 0;\n let totalDepositedValue = BigNumber(0);\n let totalBorrowCapacityValue = BigNumber(0);\n let totalRequiredCollateralValue = BigNumber(0);\n let totalBorrowedPools = 0;\n let totalBorrowedValue = BigNumber(0);\n let totalBorrowedValueWithWeight = BigNumber(0);\n\n for (const assetCoinName of assetCoinNames) {\n const collateral = obligationQuery.collaterals.find((collateral) => {\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(\n collateral.type.name\n );\n return assetCoinName === collateralCoinName;\n });\n\n const marketCollateral = market.collaterals[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketCollateral && coinPrice) {\n const depositedAmount = BigNumber(collateral?.amount ?? 0);\n const depositedCoin = depositedAmount.shiftedBy(-1 * coinDecimal);\n const depositedValue = depositedCoin.multipliedBy(coinPrice);\n const borrowCapacityValue = depositedValue.multipliedBy(\n marketCollateral.collateralFactor\n );\n const requiredCollateralValue = depositedValue.multipliedBy(\n marketCollateral.liquidationFactor\n );\n const availableDepositAmount = BigNumber(coinAmount);\n const availableDepositCoin = availableDepositAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n totalDepositedValue = totalDepositedValue.plus(depositedValue);\n totalBorrowCapacityValue =\n totalBorrowCapacityValue.plus(borrowCapacityValue);\n totalRequiredCollateralValue = totalRequiredCollateralValue.plus(\n requiredCollateralValue\n );\n\n if (depositedAmount.isGreaterThan(0)) {\n totalDepositedPools++;\n }\n\n collaterals[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n depositedAmount: depositedAmount.toNumber(),\n depositedCoin: depositedCoin.toNumber(),\n depositedValue: depositedValue.toNumber(),\n borrowCapacityValue: borrowCapacityValue.toNumber(),\n requiredCollateralValue: requiredCollateralValue.toNumber(),\n availableDepositAmount: availableDepositAmount.toNumber(),\n availableDepositCoin: availableDepositCoin.toNumber(),\n availableWithdrawAmount: 0,\n availableWithdrawCoin: 0,\n };\n }\n }\n\n for (const assetCoinName of assetCoinNames) {\n const debt = obligationQuery.debts.find((debt) => {\n const poolCoinName = query.utils.parseCoinNameFromType<SupportPoolCoins>(\n debt.type.name\n );\n return assetCoinName === poolCoinName;\n });\n\n const marketPool = market.pools[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketPool && coinPrice) {\n const increasedRate = debt?.borrowIndex\n ? marketPool.borrowIndex / Number(debt.borrowIndex) - 1\n : 0;\n const borrowedAmount = BigNumber(debt?.amount ?? 0);\n const borrowedCoin = borrowedAmount.shiftedBy(-1 * coinDecimal);\n\n const requiredRepayAmount = borrowedAmount.multipliedBy(\n increasedRate + 1\n );\n const requiredRepayCoin = requiredRepayAmount.shiftedBy(-1 * coinDecimal);\n\n const availableRepayAmount = BigNumber(coinAmount);\n const availableRepayCoin = availableRepayAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n const borrowedValue = requiredRepayCoin.multipliedBy(coinPrice);\n const borrowedValueWithWeight = borrowedValue.multipliedBy(\n marketPool.borrowWeight\n );\n\n totalBorrowedValue = totalBorrowedValue.plus(borrowedValue);\n totalBorrowedValueWithWeight = totalBorrowedValueWithWeight.plus(\n borrowedValueWithWeight\n );\n\n if (borrowedAmount.isGreaterThan(0)) {\n totalBorrowedPools++;\n }\n\n debts[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n borrowedAmount: borrowedAmount.toNumber(),\n borrowedCoin: borrowedCoin.toNumber(),\n borrowedValue: borrowedValue.toNumber(),\n borrowedValueWithWeight: borrowedValueWithWeight.toNumber(),\n borrowIndex: Number(debt?.borrowIndex ?? 0),\n requiredRepayAmount: requiredRepayAmount.toNumber(),\n requiredRepayCoin: requiredRepayCoin.toNumber(),\n availableBorrowAmount: 0,\n availableBorrowCoin: 0,\n availableRepayAmount: availableRepayAmount.toNumber(),\n availableRepayCoin: availableRepayCoin.toNumber(),\n };\n }\n }\n\n for (const [poolCoinName, borrowIncentiveAccount] of Object.entries(\n borrowIncentiveAccounts\n )) {\n const coinName = poolCoinName as SupportBorrowIncentiveCoins;\n const borrowIncentivePool = borrowIncentivePools[coinName];\n\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n if (borrowIncentivePool) {\n const accountBorrowedAmount = BigNumber(borrowIncentiveAccount.amount);\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = borrowIncentivePool.currentPointIndex\n ? BigNumber(\n borrowIncentivePool.currentPointIndex - borrowIncentiveAccount.index\n ).dividedBy(baseIndexRate)\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountBorrowedAmount\n .multipliedBy(increasedPointRate)\n .plus(borrowIncentiveAccount.points)\n .multipliedBy(borrowIncentivePool.exchangeRateNumerator)\n .dividedBy(borrowIncentivePool.exchangeRateDenominator)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * borrowIncentivePool.rewardCoinDecimal\n );\n\n if (availableClaimAmount.isGreaterThan(0)) {\n borrowIncentives[coinName] = {\n coinName: borrowIncentivePool.coinName,\n coinType: borrowIncentivePool.coinType,\n rewardCoinType: borrowIncentivePool.rewardCoinType,\n symbol: borrowIncentivePool.symbol,\n coinDecimal: borrowIncentivePool.coinDecimal,\n rewardCoinDecimal: borrowIncentivePool.rewardCoinDecimal,\n coinPrice: borrowIncentivePool.coinPrice,\n rewardCoinPrice: borrowIncentivePool.rewardCoinPrice,\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n };\n }\n }\n }\n\n let riskLevel = totalRequiredCollateralValue.isZero()\n ? BigNumber(0)\n : totalBorrowedValueWithWeight.dividedBy(totalRequiredCollateralValue);\n // Note: 100% represents the safety upper limit. Even if it exceeds 100% before it is liquidated, it will only display 100%.\n riskLevel = riskLevel.isLessThan(1) ? riskLevel : BigNumber(1);\n\n const accountBalanceValue = totalDepositedValue\n .minus(totalBorrowedValue)\n .isGreaterThan(0)\n ? totalDepositedValue.minus(totalBorrowedValue)\n : BigNumber(0);\n const availableCollateralValue = totalBorrowCapacityValue\n .minus(totalBorrowedValueWithWeight)\n .isGreaterThan(0)\n ? totalBorrowCapacityValue.minus(totalBorrowedValueWithWeight)\n : BigNumber(0);\n const requiredCollateralValue = totalBorrowedValueWithWeight.isGreaterThan(0)\n ? totalRequiredCollateralValue\n : BigNumber(0);\n const unhealthyCollateralValue = totalBorrowedValueWithWeight\n .minus(requiredCollateralValue)\n .isGreaterThan(0)\n ? totalBorrowedValueWithWeight.minus(requiredCollateralValue)\n : BigNumber(0);\n\n const obligationAccount: ObligationAccount = {\n obligationId: obligationId,\n // Deposited collateral value (collateral balance)\n totalDepositedValue: totalDepositedValue.toNumber(),\n // Borrowed debt value (liabilities balance)\n totalBorrowedValue: totalBorrowedValue.toNumber(),\n // The difference between the user’s actual deposit and loan (remaining balance)\n totalBalanceValue: accountBalanceValue.toNumber(),\n // Effective collateral value (the actual collateral value included in the calculation).\n totalBorrowCapacityValue: totalBorrowCapacityValue.toNumber(),\n // Available collateral value (the remaining collateral value that can be borrowed).\n totalAvailableCollateralValue: availableCollateralValue.toNumber(),\n // Available debt value (the actual borrowing value included in the calculation).\n totalBorrowedValueWithWeight: totalBorrowedValueWithWeight.toNumber(),\n // Required collateral value (avoid be liquidated).\n totalRequiredCollateralValue: requiredCollateralValue.toNumber(),\n // Unliquidated collateral value (pending liquidation).\n totalUnhealthyCollateralValue: unhealthyCollateralValue.toNumber(),\n totalRiskLevel: riskLevel.toNumber(),\n totalDepositedPools,\n totalBorrowedPools,\n collaterals,\n debts,\n borrowIncentives,\n };\n\n for (const [collateralCoinName, obligationCollateral] of Object.entries(\n obligationAccount.collaterals\n )) {\n const marketCollateral =\n market.collaterals[collateralCoinName as SupportCollateralCoins];\n if (marketCollateral) {\n let estimatedAvailableWithdrawAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketCollateral.collateralFactor)\n .dividedBy(marketCollateral.coinPrice)\n .shiftedBy(marketCollateral.coinDecimal);\n estimatedAvailableWithdrawAmount =\n obligationAccount.totalBorrowedValueWithWeight === 0\n ? // Note: when there is no debt record, there is no need to estimate and the deposited amount is directly used as available withdraw.\n BigNumber(obligationCollateral.depositedAmount)\n : minBigNumber(\n estimatedAvailableWithdrawAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n BigNumber(obligationAccount.totalAvailableCollateralValue)\n .dividedBy(marketCollateral.collateralFactor)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n obligationCollateral.depositedAmount,\n marketCollateral.depositAmount\n );\n obligationCollateral.availableWithdrawAmount =\n estimatedAvailableWithdrawAmount.toNumber();\n obligationCollateral.availableWithdrawCoin =\n estimatedAvailableWithdrawAmount\n .shiftedBy(-1 * obligationCollateral.coinDecimal)\n .toNumber();\n }\n }\n for (const [poolCoinName, obligationDebt] of Object.entries(\n obligationAccount.debts\n )) {\n const marketPool = market.pools[poolCoinName as SupportPoolCoins];\n if (marketPool) {\n const estimatedRequiredRepayAmount = BigNumber(\n obligationDebt.requiredRepayAmount\n )\n // Note: reduced chance of not being able to repay in full when calculations are inaccurate,\n // and the contract will not actually take the excess amount.\n .multipliedBy(\n estimatedFactor(obligationDebt.borrowedValue, 3, 'decrease')\n );\n\n let estimatedAvailableBorrowAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketPool.borrowWeight)\n .shiftedBy(marketPool.coinDecimal)\n .dividedBy(marketPool.coinPrice);\n estimatedAvailableBorrowAmount =\n obligationAccount.totalAvailableCollateralValue !== 0\n ? minBigNumber(\n estimatedAvailableBorrowAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n estimatedAvailableBorrowAmount\n .shiftedBy(-1 * marketPool.coinDecimal)\n .multipliedBy(marketPool.coinPrice)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n marketPool.supplyAmount\n )\n : BigNumber(0);\n\n obligationDebt.availableBorrowAmount =\n estimatedAvailableBorrowAmount.toNumber();\n obligationDebt.availableBorrowCoin = estimatedAvailableBorrowAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n obligationDebt.requiredRepayAmount =\n estimatedRequiredRepayAmount.toNumber();\n obligationDebt.requiredRepayCoin = estimatedRequiredRepayAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n }\n }\n\n return obligationAccount;\n};\n\n/**\n * Get total value locked data.\n *\n * @param query - The Scallop query instance.\n * @return Total value locked data.\n */\nexport const getTotalValueLocked = async (query: ScallopQuery) => {\n const market = await query.queryMarket();\n\n let supplyValue = BigNumber(0);\n let borrowValue = BigNumber(0);\n\n for (const pool of Object.values(market.pools)) {\n supplyValue = supplyValue.plus(\n BigNumber(pool.supplyCoin).multipliedBy(pool.coinPrice)\n );\n borrowValue = borrowValue.plus(\n BigNumber(pool.borrowCoin).multipliedBy(pool.coinPrice)\n );\n }\n\n for (const collateral of Object.values(market.collaterals)) {\n supplyValue = supplyValue.plus(\n BigNumber(collateral.depositCoin).multipliedBy(collateral.coinPrice)\n );\n }\n\n const tvl: TotalValueLocked = {\n supplyValue: supplyValue.toNumber(),\n borrowValue: borrowValue.toNumber(),\n totalValue: supplyValue.minus(borrowValue).toNumber(),\n };\n\n return tvl;\n};\n","import { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID } from '../constants';\nimport { newScallopTxBlock } from '../builders';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui.js/client';\nimport type { TransactionBlock } from '@mysten/sui.js/transactions';\nimport type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport type {\n ScallopInstanceParams,\n ScallopBuilderParams,\n ScallopTxBlock,\n SupportMarketCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * @description\n * it provides methods for operating the transaction block, making it more convenient to organize transaction combinations.\n *\n * @example\n * ```typescript\n * const scallopBuilder = new ScallopBuilder(<parameters>);\n * await scallopBuilder.init();\n * const txBlock = scallopBuilder.<builder functions>();\n * ```\n */\nexport class ScallopBuilder {\n public readonly params: ScallopBuilderParams;\n public readonly isTestnet: boolean;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public walletAddress: string;\n\n public constructor(\n params: ScallopBuilderParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this.suiKit,\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n });\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress || this.suiKit.currentAddress()\n );\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.query.init(forece);\n await this.utils.init(forece);\n }\n\n /**\n * Create a scallop txBlock instance that enhances transaction block.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop txBlock.\n */\n public createTxBlock(\n txBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n ) {\n return newScallopTxBlock(this, txBlock);\n }\n\n /**\n * Specifying the sender's amount of coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param assetCoinName - Specific support asset coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n assetCoinName: SupportAssetCoins,\n amount: number,\n sender: string\n ) {\n const coinType = this.utils.parseCoinType(assetCoinName);\n const coins = await this.utils.selectCoinIds(amount, coinType, sender);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Specifying the sender's amount of market coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support market coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectMarketCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n marketCoinName: SupportMarketCoins,\n amount: number,\n sender: string\n ) {\n const marketCoinType = this.utils.parseMarketCoinType(marketCoinName);\n const coins = await this.utils.selectCoinIds(\n amount,\n marketCoinType,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Execute Scallop txBlock using the `signAndSendTxn` methods in suikit.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n */\n public async signAndSendTxBlock(\n txBlock: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n ) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as SuiTransactionBlockResponse;\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { getObligations } from '../queries';\nimport { updateOracles } from './oracle';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n CoreIds,\n GenerateCoreNormalMethod,\n GenerateCoreQuickMethod,\n SuiTxBlockWithCoreNormalMethods,\n CoreTxBlock,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (params.length === 3 && obligationId) return { obligationId };\n if (params.length === 4 && obligationId && obligationKey)\n return { obligationId, obligationKey };\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n };\n};\n\n/**\n * Generate core normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core normal methods.\n */\nconst generateCoreNormalMethod: GenerateCoreNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const coreIds: CoreIds = {\n protocolPkg: builder.address.get('core.packages.protocol.id'),\n market: builder.address.get('core.market'),\n version: builder.address.get('core.version'),\n coinDecimalsRegistry: builder.address.get('core.coinDecimalsRegistry'),\n xOracle: builder.address.get('core.oracles.xOracle'),\n };\n return {\n openObligation: () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n [coreIds.version]\n ),\n returnObligation: (obligation, obligationHotPotato) =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n [coreIds.version, obligation, obligationHotPotato]\n ),\n openObligationEntry: () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n [coreIds.version]\n ),\n addCollateral: (obligation, coin, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n [coreIds.version, obligation, coreIds.market, coin],\n [coinType]\n );\n },\n takeCollateral: (obligation, obligationKey, amount, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n deposit: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::mint::mint`,\n [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n depositEntry: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::mint::mint_entry`,\n [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n withdraw: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::redeem::redeem`,\n [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n withdrawEntry: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::redeem::redeem_entry`,\n [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n borrow: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow_entry`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n repay: (obligation, coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::repay::repay`,\n [\n coreIds.version,\n obligation,\n coreIds.market,\n coin,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowFlashLoan: (amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n [coreIds.version, coreIds.market, amount],\n [coinType]\n );\n },\n repayFlashLoan: (coin, loan, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::repay_flash_loan`,\n [coreIds.version, coreIds.market, coin, loan],\n [coinType]\n );\n },\n };\n};\n\n/**\n * Generate core quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include query obligation info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core quick methods.\n */\nconst generateCoreQuickMethod: GenerateCoreQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n addCollateralQuick: async (amount, collateralCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (collateralCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n txBlock.addCollateral(obligationArg, suiCoin, collateralCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n collateralCoinName,\n amount,\n sender\n );\n txBlock.addCollateral(obligationArg, takeCoin, collateralCoinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick: async (\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n ) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const updateCoinNames = await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n );\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.takeCollateral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n collateralCoinName\n );\n },\n depositQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.deposit(suiCoin, poolCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.deposit(takeCoin, poolCoinName);\n }\n },\n withdrawQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n const marketCoinName = builder.utils.parseMarketCoinName(poolCoinName);\n const { leftCoin, takeCoin } = await builder.selectMarketCoin(\n txBlock,\n marketCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.withdraw(takeCoin, poolCoinName);\n },\n borrowQuick: async (amount, poolCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const obligationCoinNames = await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n );\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.borrow(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n poolCoinName\n );\n },\n repayQuick: async (amount, poolCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.repay(\n obligationInfo.obligationId,\n suiCoin,\n poolCoinName\n );\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.repay(\n obligationInfo.obligationId,\n takeCoin,\n poolCoinName\n );\n }\n },\n updateAssetPricesQuick: async (assetCoinNames) => {\n return updateOracles(builder, txBlock, assetCoinNames);\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with core modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop core txBlock.\n */\nexport const newCoreTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateCoreNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithCoreNormalMethods;\n\n const quickMethod = generateCoreQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as CoreTxBlock;\n};\n","import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport {\n SuiPythClient,\n SuiPriceServiceConnection,\n} from '@pythnetwork/pyth-sui-js';\nimport { SUPPORT_COLLATERALS, SUPPORT_POOLS } from '../constants';\nimport type { TransactionArgument } from '@mysten/sui.js/transactions';\nimport type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type { SupportAssetCoins, SupportOracleType } from '../types';\n\n/**\n * Update the price of the oracle for multiple coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinNames - Specific an array of support asset coin name.\n */\nexport const updateOracles = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinNames?: SupportAssetCoins[]\n) => {\n assetCoinNames = assetCoinNames ?? [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ];\n const rules: SupportOracleType[] = builder.isTestnet ? ['pyth'] : ['pyth'];\n if (rules.includes('pyth')) {\n const pythClient = new SuiPythClient(\n builder.suiKit.client(),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get('core.oracles.pyth.wormholeState')\n );\n const priceIds = assetCoinNames.map((assetCoinName) =>\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`)\n );\n const pythConnection = new SuiPriceServiceConnection(\n builder.isTestnet\n ? 'https://hermes-beta.pyth.network'\n : 'https://hermes.pyth.network'\n );\n const priceUpdateData =\n await pythConnection.getPriceFeedsUpdateData(priceIds);\n await pythClient.updatePriceFeeds(\n txBlock.txBlock,\n priceUpdateData,\n priceIds\n );\n }\n\n // Remove duplicate coin names.\n const updateAssetCoinNames = [...new Set(assetCoinNames)];\n for (const assetCoinName of updateAssetCoinNames) {\n await updateOracle(builder, txBlock, assetCoinName, rules);\n }\n};\n\n/**\n * Update the price of the oracle for specific coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinName - Specific support asset coin name.\n */\nconst updateOracle = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinName: SupportAssetCoins,\n rules: SupportOracleType[]\n) => {\n const coinType = builder.utils.parseCoinType(assetCoinName);\n\n updatePrice(\n txBlock,\n rules,\n builder.address.get('core.packages.xOracle.id'),\n builder.address.get('core.oracles.xOracle'),\n builder.address.get('core.packages.pyth.id'),\n builder.address.get('core.oracles.pyth.registry'),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`),\n builder.address.get('core.packages.switchboard.id'),\n builder.address.get('core.oracles.switchboard.registry'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.switchboard`),\n builder.address.get('core.packages.supra.id'),\n builder.address.get('core.oracles.supra.registry'),\n builder.address.get(`core.oracles.supra.holder`),\n coinType\n );\n};\n\n/**\n * Construct a transaction block for update the price.\n *\n * @param txBlock - The transaction block.\n * @param rules - The oracle rules.\n * @param xOraclePackageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param pythPackageId - The pyth package id.\n * @param pythRegistryId - The registry id from pyth package.\n * @param pythStateId - The price state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param switchboardPackageId - The switchboard package id.\n * @param switchboardRegistryId - The registry id from switchboard package.\n * @param switchboardAggregatorId - The aggregator id from switchboard package.\n * @param supraPackageId - The supra package id.\n * @param supraRegistryId - The registry id from supra package.\n * @param supraHolderId - The holder id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePrice = (\n txBlock: SuiKitTxBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n switchboardPackageId: string,\n switchboardRegistryId: TransactionArgument | string,\n switchboardAggregatorId: TransactionArgument | string,\n supraPackageId: string,\n supraRegistryId: TransactionArgument | string,\n supraHolderId: TransactionArgument | string,\n coinType: string\n) => {\n const request = priceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n coinType\n );\n if (rules.includes('pyth')) {\n updatePythPrice(\n txBlock,\n pythPackageId,\n request,\n pythStateId,\n pythFeedObjectId,\n pythRegistryId,\n coinType\n );\n }\n if (rules.includes('switchboard')) {\n updateSwitchboardPrice(\n txBlock,\n switchboardPackageId,\n request,\n switchboardAggregatorId,\n switchboardRegistryId,\n coinType\n );\n }\n if (rules.includes('supra')) {\n updateSupraPrice(\n txBlock,\n supraPackageId,\n request,\n supraHolderId,\n supraRegistryId,\n coinType\n );\n }\n confirmPriceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n request,\n coinType\n );\n return txBlock;\n};\n\n/**\n * Construct a transaction block for request price update.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst priceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::price_update_request`;\n const typeArgs = [coinType];\n return txBlock.moveCall(target, [xOracleId], typeArgs);\n};\n\n/**\n * Construct a transaction block for confirm price update request.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param request - The result of the request.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst confirmPriceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n request: TransactionArgument,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::confirm_price_update_request`;\n const typeArgs = [coinType];\n txBlock.moveCall(target, [xOracleId, request, SUI_CLOCK_OBJECT_ID], typeArgs);\n return txBlock;\n};\n\n/**\n * Construct a transaction block for update supra price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The supra package id.\n * @param request - The result of the request.\n * @param holderId - The holder id from supra package.\n * @param registryId - The registry id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSupraPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n holderId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, holderId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update switchboard price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The switchboard package id.\n * @param request - The result of the request.\n * @param aggregatorId - The aggregator id from switchboard package.\n * @param registryId - The registry id from switchboard package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSwitchboardPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n aggregatorId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, aggregatorId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update pyth price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The pyth package id.\n * @param request - The result of the request.\n * @param stateId - The price state id from pyth package.\n * @param wormholeStateId - The whormhole state id from pyth package.\n * @param feedObjectId - The feed object id from pyth package.\n * @param vaaFromFeeId - The vaa from pyth api with feed id.\n * @param registryId - The registry id from pyth package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePythPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n stateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, stateId, feedObjectId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { spoolRewardCoins } from '../constants/enum';\nimport { getStakeAccounts } from '../queries/spoolQuery';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { TransactionResult } from '@mysten/sui.js/transactions';\nimport type { ScallopBuilder } from '../models';\nimport type {\n SpoolIds,\n GenerateSpoolNormalMethod,\n GenerateSpoolQuickMethod,\n SuiTxBlockWithSpoolNormalMethods,\n SpoolTxBlock,\n SupportStakeMarketCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get stake account id from transaction block.\n *\n * @description\n * If the stake account id is provided, direactly return it.\n * Otherwise, automatically get all stake account id from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake account ids.\n */\nconst requireStakeAccountIds = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n if (params.length === 4 && stakeAccountId) return [stakeAccountId];\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account id found for sender ${sender}`);\n }\n return stakeAccounts[stakeMarketCoinName].map((account) => account.id);\n};\n\n/**\n * Check and get stake accounts information from transaction block.\n *\n * @description\n * If the stake account id is provided, direactly return its account.\n * Otherwise, automatically get all stake account from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake accounts.\n */\nconst requireStakeAccounts = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account found for sender ${sender}`);\n }\n\n const specificStakeAccounts = stakeAccountId\n ? stakeAccounts[stakeMarketCoinName].filter((account) => {\n return account.id === stakeAccountId;\n })\n : stakeAccounts[stakeMarketCoinName];\n\n return specificStakeAccounts;\n};\n\n/**\n * Generate spool normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool normal methods.\n */\nconst generateSpoolNormalMethod: GenerateSpoolNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const spoolIds: SpoolIds = {\n spoolPkg: builder.address.get('spool.id'),\n };\n return {\n createStakeAccount: (stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::new_spool_account`,\n [stakePoolId, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n stake: (stakeAccount, coin, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::stake`,\n [stakePoolId, stakeAccount, coin, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n unstake: (stakeAccount, amount, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::unstake`,\n [stakePoolId, stakeAccount, amount, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n claim: (stakeAccount, stakeMarketCoinName) => {\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n const rewardPoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.rewardPoolId`\n );\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const rewardCoinName = spoolRewardCoins[stakeMarketCoinName];\n const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::redeem_rewards`,\n [stakePoolId, rewardPoolId, stakeAccount, SUI_CLOCK_OBJECT_ID],\n [marketCoinType, rewardCoinType]\n );\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nconst generateSpoolQuickMethod: GenerateSpoolQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n stakeQuick: async (\n amountOrMarketCoin,\n stakeMarketCoinName,\n stakeAccountId\n ) => {\n const sender = requireSender(txBlock);\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n if (typeof amountOrMarketCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(\n amountOrMarketCoin,\n marketCoinType,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n coins,\n amountOrMarketCoin\n );\n txBlock.stake(stakeAccountIds[0], takeCoin, stakeMarketCoinName);\n txBlock.transferObjects([leftCoin], sender);\n } else {\n txBlock.stake(\n stakeAccountIds[0],\n amountOrMarketCoin,\n stakeMarketCoinName\n );\n }\n },\n unstakeQuick: async (amount, stakeMarketCoinName, stakeAccountId) => {\n const stakeAccounts = await requireStakeAccounts(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const stakeMarketCoins: TransactionResult[] = [];\n for (const account of stakeAccounts) {\n if (account.staked === 0) continue;\n const amountToUnstake = Math.min(amount, account.staked);\n const marketCoin = txBlock.unstake(\n account.id,\n amountToUnstake,\n stakeMarketCoinName\n );\n stakeMarketCoins.push(marketCoin);\n amount -= amountToUnstake;\n if (amount === 0) break;\n }\n return stakeMarketCoins;\n },\n claimQuick: async (stakeMarketCoinName, stakeAccountId) => {\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const rewardCoins: TransactionResult[] = [];\n for (const accountId of stakeAccountIds) {\n const rewardCoin = txBlock.claim(accountId, stakeMarketCoinName);\n rewardCoins.push(rewardCoin);\n }\n return rewardCoins;\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with spool modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop spool txBlock.\n */\nexport const newSpoolTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateSpoolNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithSpoolNormalMethods;\n\n const quickMethod = generateSpoolQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SpoolTxBlock;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { borrowIncentiveRewardCoins } from '../constants/enum';\nimport { getObligations, getObligationLocked } from '../queries';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n BorrowIncentiveIds,\n GenerateBorrowIncentiveNormalMethod,\n GenerateBorrowIncentiveQuickMethod,\n SuiTxBlockWithBorrowIncentiveNormalMethods,\n BorrowIncentiveTxBlock,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (\n params.length === 4 &&\n obligationId &&\n obligationKey &&\n typeof obligationId === 'string'\n ) {\n const obligationLocked = await getObligationLocked(\n builder.query,\n obligationId\n );\n return { obligationId, obligationKey, obligationLocked };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n obligationLocked: obligations[0].locked,\n };\n};\n\n/**\n * Generate borrow incentive normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow incentive normal methods.\n */\nconst generateBorrowIncentiveNormalMethod: GenerateBorrowIncentiveNormalMethod =\n ({ builder, txBlock }) => {\n const borrowIncentiveIds: BorrowIncentiveIds = {\n borrowIncentivePkg: builder.address.get('borrowIncentive.id'),\n query: builder.address.get('borrowIncentive.query'),\n incentivePools: builder.address.get('borrowIncentive.incentivePools'),\n incentiveAccounts: builder.address.get(\n 'borrowIncentive.incentiveAccounts'\n ),\n obligationAccessStore: builder.address.get('core.obligationAccessStore'),\n };\n return {\n stakeObligation: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::stake`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n borrowIncentiveIds.obligationAccessStore,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n unstakeObligation: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n claimBorrowIncentive: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::redeem_rewards`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n };\n };\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nconst generateBorrowIncentiveQuickMethod: GenerateBorrowIncentiveQuickMethod =\n ({ builder, txBlock }) => {\n return {\n stakeObligationQuick: async (coinName, obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n const unstakeObligationBeforeStake =\n !!txBlock.txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n txn.target ===\n `${builder.address.get('borrowIncentive.id')}::user::unstake`\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n txBlock.stakeObligation(obligationArg, obligationtKeyArg, coinName);\n }\n },\n unstakeObligationQuick: async (coinName, obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n if (obligationLocked) {\n txBlock.unstakeObligation(obligationArg, obligationtKeyArg, coinName);\n }\n },\n claimBorrowIncentiveQuick: async (\n coinName,\n obligation,\n obligationKey\n ) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n return txBlock.claimBorrowIncentive(\n obligationArg,\n obligationtKeyArg,\n coinName\n );\n },\n };\n };\n\n/**\n * Create an enhanced transaction block instance for interaction with borrow incentive modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop borrow incentive txBlock.\n */\nexport const newBorrowIncentiveTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateBorrowIncentiveNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithBorrowIncentiveNormalMethods;\n\n const quickMethod = generateBorrowIncentiveQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as BorrowIncentiveTxBlock;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { newCoreTxBlock } from './coreBuilder';\nimport { newSpoolTxBlock } from './spoolBuilder';\nimport { newBorrowIncentiveTxBlock } from './borrowIncentiveBuilder';\nimport type { ScallopBuilder } from '../models';\nimport type { ScallopTxBlock } from '../types';\n\n/**\n * Create a new ScallopTxBlock instance.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return ScallopTxBlock.\n */\nexport const newScallopTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n): ScallopTxBlock => {\n const borrowIncentiveTxBlock = newBorrowIncentiveTxBlock(\n builder,\n initTxBlock\n );\n const spoolTxBlock = newSpoolTxBlock(builder, borrowIncentiveTxBlock);\n const coreTxBlock = newCoreTxBlock(builder, spoolTxBlock);\n\n return new Proxy(coreTxBlock, {\n get: (target, prop) => {\n if (prop in borrowIncentiveTxBlock) {\n return Reflect.get(borrowIncentiveTxBlock, prop);\n } else if (prop in spoolTxBlock) {\n return Reflect.get(spoolTxBlock, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as ScallopTxBlock;\n};\n"],"mappings":"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","names":["SuiKit","network","addresses","normalizeSuiAddress","SuiKit","normalizeStructTag","SuiKit","normalizeStructTag","BigNumber","assetCoinName","normalizeStructTag","BigNumber","normalizeStructTag","normalizeStructTag","normalizeStructTag","SuiKitTxBlock","SuiKitTxBlock","normalizeStructTag","BigNumber","marketCoinName","BigNumber","collateral","requiredCollateralValue","debt","SuiKit","normalizeStructTag","SuiKit","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","SuiPriceServiceConnection","SuiPriceServiceConnection","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","TransactionBlock","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","stakeMarketCoins","TransactionBlock","SuiKitTxBlock","TransactionBlock","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","requireObligationInfo","SUI_CLOCK_OBJECT_ID","TransactionBlock","SuiKitTxBlock","SuiKit","SuiKit","normalizeSuiAddress","marketCoins","stakeMarketCoins","SuiKit"]}
1
+ {"version":3,"sources":["../src/constants/common.ts","../src/constants/enum.ts","../src/models/scallop.ts","../src/models/scallopAddress.ts","../src/models/scallopClient.ts","../src/models/scallopUtils.ts","../src/models/scallopQuery.ts","../src/queries/coreQuery.ts","../src/utils/builder.ts","../src/utils/query.ts","../src/utils/util.ts","../src/queries/spoolQuery.ts","../src/queries/borrowIncentiveQuery.ts","../src/queries/priceQuery.ts","../src/queries/portfolioQuery.ts","../src/models/scallopIndexer.ts","../src/models/scallopBuilder.ts","../src/builders/coreBuilder.ts","../src/builders/oracle.ts","../src/builders/spoolBuilder.ts","../src/builders/borrowIncentiveBuilder.ts","../src/builders/index.ts"],"sourcesContent":["export const API_BASE_URL = 'https://sui.api.scallop.io';\nexport const SDK_API_BASE_URL = 'https://sdk.api.scallop.io';\n\nexport const ADDRESSES_ID = '6462a088a7ace142bb6d7e9b';\n\nexport const PROTOCOL_OBJECT_ID =\n '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf';\n\nexport const BORROW_FEE_PROTOCOL_ID =\n '0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da';\n\nexport const SUPPORT_POOLS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n] as const;\n\nexport const SUPPORT_COLLATERALS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n] as const;\n\nexport const SUPPORT_SPOOLS = ['ssui', 'susdc', 'susdt'] as const;\n\nexport const SUPPORT_SPOOLS_REWARDS = ['sui'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_POOLS = ['sui', 'usdc', 'usdt'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_REWARDS = ['sui'] as const;\nexport const SUPPORT_ORACLES = ['supra', 'switchboard', 'pyth'] as const;\n\nexport const SUPPORT_PACKAGES = [\n 'coinDecimalsRegistry',\n 'math',\n 'whitelist',\n 'x',\n 'protocol',\n 'protocolWhitelist',\n 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n","import type {\n SupportCoinDecimals,\n AssetCoins,\n MarketCoins,\n StakeMarketCoins,\n StakeRewardCoins,\n BorrowIncentiveRewardCoins,\n AssetCoinIds,\n WormholeCoinIds,\n VoloCoinIds,\n} from '../types';\n\nexport const coinDecimals: SupportCoinDecimals = {\n eth: 8,\n btc: 8,\n usdc: 6,\n usdt: 6,\n sui: 9,\n apt: 8,\n sol: 8,\n cetus: 9,\n afsui: 9,\n hasui: 9,\n vsui: 9,\n seth: 8,\n sbtc: 8,\n susdc: 6,\n susdt: 6,\n ssui: 9,\n sapt: 8,\n ssol: 8,\n scetus: 9,\n safsui: 9,\n shasui: 9,\n svsui: 9,\n};\n\nexport const assetCoins: AssetCoins = {\n eth: 'eth',\n btc: 'btc',\n usdc: 'usdc',\n usdt: 'usdt',\n sui: 'sui',\n apt: 'apt',\n sol: 'sol',\n cetus: 'cetus',\n afsui: 'afsui',\n hasui: 'hasui',\n vsui: 'vsui',\n};\n\nexport const marketCoins: MarketCoins = {\n seth: 'seth',\n sbtc: 'sbtc',\n susdc: 'susdc',\n susdt: 'susdt',\n ssui: 'ssui',\n sapt: 'sapt',\n ssol: 'ssol',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n};\n\nexport const stakeMarketCoins: StakeMarketCoins = {\n ssui: 'ssui',\n susdc: 'susdc',\n susdt: 'susdt',\n};\n\nexport const spoolRewardCoins: StakeRewardCoins = {\n ssui: 'sui',\n susdc: 'sui',\n susdt: 'sui',\n};\n\nexport const borrowIncentiveRewardCoins: BorrowIncentiveRewardCoins = {\n sui: 'sui',\n usdc: 'sui',\n usdt: 'sui',\n};\n\nexport const coinIds: AssetCoinIds = {\n sui: '0x0000000000000000000000000000000000000000000000000000000000000002',\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n cetus: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n afsui: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n hasui: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n\nexport const wormholeCoinIds: WormholeCoinIds = {\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n};\n\nexport const voloCoinIds: VoloCoinIds = {\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopClient } from './scallopClient';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID } from '../constants';\nimport type { ScallopParams } from '../types/';\nimport { ScallopIndexer } from './scallopIndexer';\n\n/**\n * @description\n * The main instance that controls interaction with the Scallop contract.\n *\n * @example\n * ```typescript\n * const sdk = new Scallop(<parameters>);\n * const scallopAddress = await sdk.getScallopAddress();\n * const scallopBuilder = await sdk.createScallopBuilder();\n * const scallopClient = await sdk.createScallopClient();\n * const scallopIndexer= await sdk.createScallopIndexer();\n * const scallopUtils= await sdk.createScallopUtils();\n * ```\n */\nexport class Scallop {\n public params: ScallopParams;\n public suiKit: SuiKit;\n\n private _address: ScallopAddress;\n\n public constructor(params: ScallopParams) {\n this.params = params;\n this.suiKit = new SuiKit(params);\n this._address = new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n }\n\n /**\n * Get a scallop address instance that already has read addresses.\n *\n * @param id - The API id of the addresses.\n * @return Scallop Address.\n */\n public async getScallopAddress(id?: string) {\n await this._address.read(id);\n\n return this._address;\n }\n\n /**\n * Create a scallop builder instance that already has initial data.\n *\n * @return Scallop Builder.\n */\n public async createScallopBuilder() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopBuilder = new ScallopBuilder(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopBuilder;\n }\n\n /**\n * Create a scallop client instance that already has initial data.\n *\n * @param walletAddress - When user cannot provide a secret key or mnemonic, the scallop client cannot directly derive the address of the transaction the user wants to sign. This argument specifies the wallet address for signing the transaction.\n * @return Scallop Client.\n */\n public async createScallopClient(walletAddress?: string) {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopClient = new ScallopClient(\n { ...this.params, walletAddress },\n { suiKit: this.suiKit, address: this._address }\n );\n\n return scallopClient;\n }\n\n /**\n * Create a scallop query instance.\n *\n * @return Scallop Query.\n */\n public async createScallopQuery() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopQuery = new ScallopQuery(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopQuery;\n }\n\n /**\n * Create a scallop indexer instance.\n *\n * @return Scallop Indexer.\n */\n public async createScallopIndexer() {\n const scallopIndexer = new ScallopIndexer();\n\n return scallopIndexer;\n }\n\n /**\n * Create a scallop utils instance.\n *\n * @return Scallop Utils.\n */\n public async createScallopUtils() {\n if (!this._address.getAddresses()) await this._address.read();\n const scallopUtils = new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this._address,\n });\n\n return scallopUtils;\n }\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { API_BASE_URL } from '../constants';\nimport type { NetworkType } from '@scallop-io/sui-kit';\nimport type {\n ScallopAddressParams,\n AddressesInterface,\n AddressStringPath,\n} from '../types';\n\nconst EMPTY_ADDRESSES: AddressesInterface = {\n core: {\n version: '',\n versionCap: '',\n object: '',\n market: '',\n adminCap: '',\n coinDecimalsRegistry: '',\n obligationAccessStore: '',\n coins: {\n btc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n eth: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n usdc: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n usdt: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n sui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n afsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n hasui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n vsui: {\n id: '',\n metaData: '',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '',\n feedObject: '',\n },\n },\n },\n },\n oracles: {\n xOracle: '',\n xOracleCap: '',\n supra: {\n registry: '',\n registryCap: '',\n holder: '',\n },\n switchboard: {\n registry: '',\n registryCap: '',\n },\n pyth: {\n registry: '',\n registryCap: '',\n state: '',\n wormhole: '',\n wormholeState: '',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '',\n upgradeCap: '',\n },\n math: {\n id: '',\n upgradeCap: '',\n },\n whitelist: {\n id: '',\n upgradeCap: '',\n },\n x: {\n id: '',\n upgradeCap: '',\n },\n protocol: {\n id: '',\n upgradeCap: '',\n },\n query: {\n id: '',\n upgradeCap: '',\n },\n pyth: {\n id: '',\n upgradeCap: '',\n },\n switchboard: {\n id: '',\n upgradeCap: '',\n },\n xOracle: {\n id: '',\n upgradeCap: '',\n },\n // Deploy for faucet on testnet.\n testCoin: {\n id: '',\n upgradeCap: '',\n },\n },\n },\n spool: {\n id: '',\n adminCap: '',\n object: '',\n pools: {\n ssui: {\n id: '',\n rewardPoolId: '',\n },\n susdc: {\n id: '',\n rewardPoolId: '',\n },\n },\n },\n borrowIncentive: {\n id: '',\n adminCap: '',\n object: '',\n query: '',\n incentivePools: '',\n incentiveAccounts: '',\n },\n};\n\n/**\n * @description\n * It provides methods for managing addresses.\n *\n * @example\n * ```typescript\n * const scallopAddress = new ScallopAddress(<parameters>);\n * scallopAddress.<address functions>();\n * await scallopAddress.<address async functions>();\n * ```\n */\nexport class ScallopAddress {\n private readonly _auth?: string;\n\n private _requestClient: AxiosInstance;\n private _id?: string;\n private _network: NetworkType;\n private _currentAddresses?: AddressesInterface;\n private _addressesMap: Map<NetworkType, AddressesInterface>;\n\n public constructor(params: ScallopAddressParams) {\n const { id, auth, network } = params;\n\n if (auth) this._auth = auth;\n this._id = id;\n this._network = network || 'mainnet';\n this._addressesMap = new Map();\n this._requestClient = axios.create({\n baseURL: API_BASE_URL,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30000,\n });\n }\n\n /**\n * Get addresses API id.\n *\n * @return The addresses API id.\n */\n public getId() {\n return this._id || undefined;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @return The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._currentAddresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object'\n ? nestedAddressObj[key]\n : nestedAddressObj,\n this._currentAddresses\n );\n return value || undefined;\n } else {\n return undefined;\n }\n }\n\n /**\n * Sets the address for the specified path, it does not interact with the API.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @return The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._currentAddresses) {\n const keys = path.split('.');\n keys.reduce((nestedAddressObj: any, key: string, index) => {\n if (index === keys.length - 1) {\n nestedAddressObj[key] = address;\n } else {\n return nestedAddressObj[key];\n }\n }, this._currentAddresses);\n }\n return this._currentAddresses;\n }\n\n /**\n * Synchronize the specified network addresses from the addresses map to the\n * current addresses and change the default network to specified network.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @return Current addresses.\n */\n public switchCurrentAddresses(network: NetworkType) {\n if (this._addressesMap.has(network)) {\n this._currentAddresses = this._addressesMap.get(network);\n this._network = network;\n }\n return this._currentAddresses;\n }\n\n /**\n * Get the addresses, If `network` is not provided, returns the current\n * addresses or the default network addresses in the addresses map.\n *\n * @param network - Specifies which network's addresses you want to get.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n } else {\n return this._currentAddresses ?? this._addressesMap.get(this._network);\n }\n }\n\n /**\n * Set the addresses into addresses map. If the specified network is the same\n * as the current network, the current addresses will be updated at the same time.\n *\n * @param addresses - The addresses be setted to the tartget network.\n * @param network - Specifies which network's addresses you want to set.\n * @return The addresses.\n */\n public setAddresses(addresses: AddressesInterface, network?: NetworkType) {\n const targetNetwork = network || this._network;\n if (targetNetwork === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(targetNetwork, addresses);\n }\n\n /**\n * Get all addresses.\n *\n * @return All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n /**\n * Create a new addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication API key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async create(params?: {\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (apiKey !== undefined) {\n this._addressesMap.clear();\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.post(\n `${API_BASE_URL}/addresses`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 201) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Read and synchronizes all addresses from the API into instance.\n *\n * @param id - The id of the addresses to get.\n * @return All addresses.\n */\n public async read(id?: string) {\n const addressesId = id || this._id || undefined;\n\n if (addressesId !== undefined) {\n const response = await this._requestClient.get(\n `${API_BASE_URL}/addresses/${addressesId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to create addresses.');\n }\n } else {\n throw Error('Please provide API addresses id.');\n }\n }\n\n /**\n * Update the addresses through the API and synchronize it back to the\n * instance.\n *\n * @description\n * If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` from instance or parameter is provided, an addresses with\n * all empty strings is created by default.\n *\n * This function only allows for one addresses to be input into a specific network\n * at a time, and does not provide an addresses map for setting addresses\n * across all networks at once.\n *\n * @param params.id - The id of the addresses to update.\n * @param params.addresses - The addresses be setted to the tartget network.\n * @param params.network - Specifies which network's addresses you want to set.\n * @param params.auth - The authentication api key.\n * @param params.memo - Add memo to the addresses created in the API.\n * @return All addresses.\n */\n public async update(params?: {\n id?: string;\n addresses?: AddressesInterface | undefined;\n network?: NetworkType | undefined;\n auth?: string | undefined;\n memo?: string | undefined;\n }) {\n const { id, addresses, network, auth, memo } = params ?? {};\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses =\n addresses ||\n this._currentAddresses ||\n this._addressesMap.get(targetNetwork) ||\n EMPTY_ADDRESSES;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be updated.');\n if (apiKey !== undefined) {\n if (id !== this._id) {\n this._addressesMap.clear();\n }\n this.setAddresses(targetAddresses, targetNetwork);\n const response = await this._requestClient.put(\n `${API_BASE_URL}/addresses/${targetId}`,\n JSON.stringify({ ...Object.fromEntries(this._addressesMap), memo }),\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n for (const [network, addresses] of Object.entries<AddressesInterface>(\n response.data\n )) {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) this._currentAddresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this.getAllAddresses();\n } else {\n throw Error('Failed to update addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n\n /**\n * Deletes all addresses of a specified id through the API and clear all\n * addresses in the instance.\n *\n * @param id - The id of the addresses to delete.\n * @param auth - The authentication API key.\n */\n public async delete(id?: string, auth?: string) {\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n\n if (targetId === undefined)\n throw Error('Require specific addresses id to be deleted.');\n if (apiKey !== undefined) {\n const response = await this._requestClient.delete(\n `${API_BASE_URL}/addresses/${targetId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': auth || this._auth,\n },\n }\n );\n\n if (response.status === 200) {\n this._id = undefined;\n this._currentAddresses = undefined;\n this._addressesMap.clear();\n } else {\n throw Error('Failed to delete addresses.');\n }\n } else {\n throw Error(\"You don't have permission to access this request.\");\n }\n }\n}\n","import { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID, SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui.js/client';\nimport type { TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport type { SuiObjectArg } from '@scallop-io/sui-kit';\nimport type {\n ScallopClientFnReturnType,\n ScallopInstanceParams,\n ScallopClientParams,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportAssetCoins,\n SupportStakeCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * @description\n * It provides contract interaction operations for general users.\n *\n * @example\n * ```typescript\n * const scallopClient = new ScallopClient(<parameters>);\n * await scallopClient.init();\n * scallopClient.<client functions>();\n * await scallopClient.<client async functions>();\n * ```\n */\nexport class ScallopClient {\n public readonly params: ScallopClientParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public builder: ScallopBuilder;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public walletAddress: string;\n\n public constructor(\n params: ScallopClientParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this.suiKit,\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n });\n this.builder =\n instance?.builder ??\n new ScallopBuilder(params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n utils: this.utils,\n });\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress || this.suiKit.currentAddress()\n );\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.query.init(forece);\n await this.utils.init(forece);\n await this.builder.init(forece);\n }\n\n /* ==================== Query Method ==================== */\n\n /**\n * Query market data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @return Market data.\n */\n public async queryMarket() {\n return await this.query.queryMarket();\n }\n\n /**\n * Get obligations data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getObligations(owner);\n }\n\n /**\n * Query obligation data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(obligationId: string) {\n return await this.query.queryObligation(obligationId);\n }\n\n /**\n * Query all stake accounts data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return All stake accounts data.\n */\n async getAllStakeAccounts(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getAllStakeAccounts(owner);\n }\n\n /**\n * Query stake account data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress?: string\n ) {\n const owner = ownerAddress || this.walletAddress;\n return await this.query.getStakeAccounts(stakeMarketCoinName, owner);\n }\n\n /**\n * Query stake pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Stake pool data.\n */\n async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakePool(stakeMarketCoinName);\n }\n\n /**\n * Query reward pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Reward pool data.\n */\n async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await this.query.getStakeRewardPool(stakeMarketCoinName);\n }\n\n /* ==================== Core Method ==================== */\n\n /**\n * Open obligation.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async openObligation(): Promise<SuiTransactionBlockResponse>;\n public async openObligation<S extends boolean>(\n sign?: S\n ): Promise<ScallopClientFnReturnType<S>>;\n public async openObligation<S extends boolean>(\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n txBlock.openObligationEntry();\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit collateral into the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign?: S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const obligations = await this.query.getObligations(sender);\n const tarketObligationId = obligationId || obligations[0].id;\n if (tarketObligationId) {\n await txBlock.addCollateralQuick(\n amount,\n collateralCoinName,\n tarketObligationId\n );\n } else {\n const [obligation, obligationKey, hotPotato] = txBlock.openObligation();\n await txBlock.addCollateralQuick(amount, collateralCoinName, obligation);\n txBlock.returnObligation(obligation, hotPotato);\n txBlock.transferObjects([obligationKey], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw collateral from the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdrawCollateral<S extends boolean>(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await txBlock.takeCollateralQuick(\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([collateralCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool.\n *\n * @param poolCoinName - Types of pool coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async deposit(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async deposit<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await txBlock.depositQuick(amount, poolCoinName);\n txBlock.transferObjects([marketCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Deposit asset into the specific pool and Stake market coin into the corresponding spool.\n *\n * @param stakeCoinName - Types of stake coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositAndStake(\n stakeCoinName: SupportStakeCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositAndStake<S extends boolean>(\n stakeCoinName: SupportStakeCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoinName =\n this.utils.parseMarketCoinName<SupportStakeMarketCoins>(stakeCoinName);\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId || stakeAccounts[0].id;\n\n const marketCoin = await txBlock.depositQuick(amount, stakeCoinName);\n if (targetStakeAccount) {\n await txBlock.stakeQuick(\n marketCoin,\n stakeMarketCoinName,\n targetStakeAccount\n );\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(marketCoin, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Withdraw asset from the specific pool, must return market coin.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would withdraw.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdraw(\n poolCoinName: SupportPoolCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async withdraw<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.withdrawQuick(amount, poolCoinName);\n txBlock.transferObjects([coin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Borrow asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrow<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n const coin = await txBlock.borrowQuick(\n amount,\n poolCoinName,\n obligationId,\n obligationKey\n );\n txBlock.transferObjects([coin], sender);\n if (sign && availableStake) {\n await txBlock.stakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Repay asset into the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would repay.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async repay<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (\n SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]\n ).includes(poolCoinName);\n if (sign && availableStake) {\n await txBlock.unstakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n await txBlock.repayQuick(amount, poolCoinName, obligationId);\n if (sign && availableStake) {\n await txBlock.stakeObligationQuick(\n poolCoinName as SupportBorrowIncentiveCoins,\n obligationId,\n obligationKey\n );\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * FlashLoan asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name..\n * @param amount - The amount of coins would repay.\n * @param callback - The callback function to build transaction block and return coin argument.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async flashLoan(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg\n ): Promise<SuiTransactionBlockResponse>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async flashLoan<S extends boolean>(\n poolCoinName: SupportPoolCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionObjectArgument | string\n ) => SuiObjectArg,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n const [coin, loan] = txBlock.borrowFlashLoan(amount, poolCoinName);\n txBlock.repayFlashLoan(await callback(txBlock, coin), loan, poolCoinName);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Spool Method ==================== */\n\n /**\n * Create stake account.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async createStakeAccount(\n marketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async createStakeAccount<S extends boolean>(\n marketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccount = txBlock.createStakeAccount(marketCoinName);\n txBlock.transferObjects([stakeAccount], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Stake market coin into the specific spool.\n *\n * @param marketCoinName - Types of market coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async stake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccounts =\n await this.query.getStakeAccounts(stakeMarketCoinName);\n const targetStakeAccount = stakeAccountId || stakeAccounts[0].id;\n if (targetStakeAccount) {\n await txBlock.stakeQuick(amount, stakeMarketCoinName, targetStakeAccount);\n } else {\n const account = txBlock.createStakeAccount(stakeMarketCoinName);\n await txBlock.stakeQuick(amount, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstake<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoins = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId\n );\n txBlock.transferObjects(marketCoins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Unstake market coin from the specific spool and withdraw asset from the corresponding pool.\n *\n * @param marketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstakeAndWithdraw(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async unstakeAndWithdraw<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeMarketCoins = await txBlock.unstakeQuick(\n amount,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n const coins = [];\n for (const stakeMarketCoin of stakeMarketCoins) {\n const stakeCoinName =\n this.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const coin = await txBlock.withdraw(stakeMarketCoin, stakeCoinName);\n coins.push(coin);\n }\n txBlock.transferObjects(coins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * Claim reward coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async claim(\n stakeMarketCoinName: SupportStakeMarketCoins\n ): Promise<SuiTransactionBlockResponse>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign?: S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async claim<S extends boolean>(\n stakeMarketCoinName: SupportStakeMarketCoins,\n sign: S = true as S,\n stakeAccountId?: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoins = await txBlock.claimQuick(\n stakeMarketCoinName,\n stakeAccountId\n );\n txBlock.transferObjects(rewardCoins, sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Borrow Incentive Method ==================== */\n\n /**\n * stake obligaion.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligaionId - The obligation account object.\n * @param obligaionKeyId - The obligation key account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async stakeObligation<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.stakeObligationQuick(coinName, obligaionId, obligaionKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * unstake obligaion.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligaionId - The obligation account object.\n * @param obligaionKeyId - The obligation key account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async unstakeObligation<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.unstakeObligationQuick(coinName, obligaionId, obligaionKeyId);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /**\n * unstake market coin from the specific spool.\n *\n * @param marketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async claimBorrowIncentive<S extends boolean>(\n coinName: SupportBorrowIncentiveCoins,\n obligaionId: string,\n obligaionKeyId: string,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.builder.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoin = await txBlock.claimBorrowIncentiveQuick(\n coinName,\n obligaionId,\n obligaionKeyId\n );\n txBlock.transferObjects([rewardCoin], sender);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n\n /* ==================== Other Method ==================== */\n\n /**\n * Mint and get test coin.\n *\n * @remarks\n * Only be used on the test network.\n *\n * @param assetCoinName - Specific asset coin name.\n * @param amount - The amount of coins minted and received.\n * @param receiveAddress - The wallet address that receives the coins.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async mintTestCoin(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign?: S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async mintTestCoin<S extends boolean>(\n assetCoinName: Exclude<SupportAssetCoins, 'sui'>,\n amount: number,\n sign: S = true as S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const isTestnet = this.params.networkType\n ? this.params.networkType === 'testnet'\n : false;\n\n if (!isTestnet) {\n throw new Error('Only be used on the test network.');\n }\n\n const txBlock = this.builder.createTxBlock();\n const recipient = receiveAddress || this.walletAddress;\n const packageId = this.address.get('core.packages.testCoin.id');\n const treasuryId = this.address.get(`core.coins.${assetCoinName}.treasury`);\n const target = `${packageId}::${assetCoinName}::mint`;\n const coin = txBlock.moveCall(target, [treasuryId, amount]);\n txBlock.transferObjects([coin], recipient);\n\n if (sign) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as ScallopClientFnReturnType<S>;\n } else {\n return txBlock.txBlock as ScallopClientFnReturnType<S>;\n }\n }\n}\n","import { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiAddressArg, SuiKit } from '@scallop-io/sui-kit';\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport {\n ADDRESSES_ID,\n PROTOCOL_OBJECT_ID,\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n spoolRewardCoins,\n borrowIncentiveRewardCoins,\n coinDecimals,\n wormholeCoinIds,\n voloCoinIds,\n coinIds,\n} from '../constants';\nimport { queryObligation } from '../queries';\nimport {\n parseDataFromPythPriceFeed,\n isMarketCoin,\n parseAssetSymbol,\n} from '../utils';\nimport type {\n ScallopUtilsParams,\n ScallopInstanceParams,\n SupportCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n CoinPrices,\n PriceMap,\n CoinWrappedType,\n} from '../types';\n\n/**\n * @description\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopUtils = new ScallopUtils(<parameters>);\n * await scallopUtils.init();\n * scallopUtils.<utils functions>();\n * await scallopUtils.<utils functions>();\n * ```\n */\nexport class ScallopUtils {\n public readonly params: ScallopUtilsParams;\n public readonly isTestnet: boolean;\n\n private _suiKit: SuiKit;\n private _address: ScallopAddress;\n private _query: ScallopQuery;\n private _priceMap: PriceMap = new Map();\n\n public constructor(\n params: ScallopUtilsParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this._suiKit = instance?.suiKit ?? new SuiKit(params);\n this._address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this._query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this._suiKit,\n address: this._address,\n });\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this._address.getAddresses()) {\n await this._address.read();\n }\n await this._query.init(forece);\n }\n\n /**\n * Convert coin name to symbol.\n *\n * @param coinName - Specific support coin name.\n * @return Symbol string.\n */\n public parseSymbol(coinName: SupportCoins) {\n if (isMarketCoin(coinName)) {\n const assetCoinName = coinName\n .slice(1)\n .toLowerCase() as SupportAssetCoins;\n return (\n coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName)\n );\n } else {\n return parseAssetSymbol(coinName);\n }\n }\n\n /**\n * Convert coin name to coin type.\n *\n * @description\n * The Coin type of wormhole is fixed `coin:Coin`. Here using package id\n * to determine and return the type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Coin type.\n */\n public parseCoinType(coinName: SupportCoins) {\n coinName = isMarketCoin(coinName) ? this.parseCoinName(coinName) : coinName;\n const coinPackageId =\n this._address.get(`core.coins.${coinName}.id`) ||\n coinIds[coinName] ||\n undefined;\n if (!coinPackageId) {\n throw Error(`Coin ${coinName} is not supported`);\n }\n if (coinName === 'sui')\n return normalizeStructTag(`${coinPackageId}::sui::SUI`);\n const wormHolePckageIds = [\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc,\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt,\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth,\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc,\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol,\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt,\n ];\n const voloPckageIds = [\n this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui,\n ];\n if (wormHolePckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n } else if (voloPckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::cert::CERT`;\n } else {\n return `${coinPackageId}::${coinName}::${coinName.toUpperCase()}`;\n }\n }\n\n /**\n * Convert coin name to market coin type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Market coin type.\n */\n public parseMarketCoinType(coinName: SupportCoins) {\n const protocolObjectId =\n this._address.get('core.object') || PROTOCOL_OBJECT_ID;\n const coinType = this.parseCoinType(coinName);\n return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;\n }\n\n /**\n * Convert coin type to coin name.\n *\n * @description\n * The coin name cannot be obtained directly from the wormhole type. Here\n * the package id is used to determine and return a specific name.\n *\n * @param coinType - Specific support coin type.\n * @return Coin Name.\n */\n public parseCoinNameFromType<T extends SupportAssetCoins>(\n coinType: string\n ): T extends SupportAssetCoins ? T : SupportAssetCoins;\n public parseCoinNameFromType<T extends SupportMarketCoins>(\n coinType: string\n ): T extends SupportMarketCoins ? T : SupportMarketCoins;\n public parseCoinNameFromType<T extends SupportCoins>(\n coinType: string\n ): T extends SupportCoins ? T : SupportCoins;\n public parseCoinNameFromType(coinType: string) {\n coinType = normalizeStructTag(coinType);\n const coinTypeRegex = new RegExp(`((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)`);\n const coinTypeMatch = coinType.match(coinTypeRegex);\n const isMarketCoinType = coinType.includes('reserve::MarketCoin');\n coinType = coinTypeMatch?.[1] || coinType;\n\n const wormHoleCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc\n }::coin::COIN`]: 'usdc',\n [`${\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt\n }::coin::COIN`]: 'usdt',\n [`${\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth\n }::coin::COIN`]: 'eth',\n [`${\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc\n }::coin::COIN`]: 'btc',\n [`${\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol\n }::coin::COIN`]: 'sol',\n [`${\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt\n }::coin::COIN`]: 'apt',\n };\n const voloCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${\n this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui\n }::cert::CERT`]: 'vsui',\n };\n\n const assetCoinName =\n wormHoleCoinTypeMap[coinType] ||\n voloCoinTypeMap[coinType] ||\n (coinType.split('::')[2].toLowerCase() as SupportAssetCoins);\n\n return isMarketCoinType\n ? this.parseMarketCoinName(assetCoinName)\n : assetCoinName;\n }\n\n /**\n * Convert marke coin name to coin name.\n *\n * @param marketCoinName - Specific support market coin name.\n * @return Coin Name.\n */\n public parseCoinName<T extends SupportAssetCoins>(marketCoinName: string) {\n return marketCoinName.slice(1) as T;\n }\n\n /**\n * Convert coin name to market coin name.\n *\n * @param coinName - Specific support coin name.\n * @return Market coin name.\n */\n public parseMarketCoinName<T extends SupportMarketCoins>(\n coinName: SupportCoins\n ) {\n return `s${coinName}` as T;\n }\n\n /**\n * Get reward type of spool.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Spool reward coin name.\n */\n public getSpoolRewardCoinName = (\n stakeMarketCoinName: SupportStakeMarketCoins\n ) => {\n return spoolRewardCoins[stakeMarketCoinName];\n };\n\n /**\n * Get reward type of borrow incentive pool.\n *\n * @param borrowIncentiveCoinName - Support borrow incentive coin.\n * @return Borrow incentive reward coin name.\n */\n public getBorrowIncentiveRewardCoinName = (\n borrowIncentiveCoinName: SupportBorrowIncentiveCoins\n ) => {\n return borrowIncentiveRewardCoins[borrowIncentiveCoinName];\n };\n\n /**\n * Get coin decimal.\n *\n * return Coin decimal.\n */\n public getCoinDecimal(coinName: SupportCoins) {\n return coinDecimals[coinName];\n }\n\n /**\n * Get coin wrapped type.\n *\n * return Coin wrapped type.\n */\n public getCoinWrappedType(assetCoinName: SupportAssetCoins): CoinWrappedType {\n return assetCoinName === 'usdc' ||\n assetCoinName === 'usdt' ||\n assetCoinName === 'eth' ||\n assetCoinName === 'btc' ||\n assetCoinName === 'apt' ||\n assetCoinName === 'sol'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n }\n\n /**\n * Select coin id that add up to the given amount as transaction arguments.\n *\n * @param ownerAddress - The address of the owner.\n * @param amount - The amount that including coin decimals.\n * @param coinType - The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoinIds(\n amount: number,\n coinType: string = SUI_TYPE_ARG,\n ownerAddress?: string\n ) {\n ownerAddress = ownerAddress || this._suiKit.currentAddress();\n const coins = await this._suiKit.suiInteractor.selectCoins(\n ownerAddress,\n amount,\n coinType\n );\n return coins.map((c) => c.objectId);\n }\n\n /**\n * Get all asset coin names in the obligation record by obligation id.\n *\n * @description\n * This can often be used to determine which assets in an obligation require\n * price updates before interacting with specific instructions of the Scallop contract.\n *\n * @param obligationId - The obligation id.\n * @return Asset coin Names.\n */\n public async getObligationCoinNames(obligationId: SuiAddressArg) {\n const obligation = await queryObligation(this._query, obligationId);\n const collateralCoinTypes = obligation.collaterals.map((collateral) => {\n return `0x${collateral.type.name}`;\n });\n const debtCoinTypes = obligation.debts.map((debt) => {\n return `0x${debt.type.name}`;\n });\n const obligationCoinTypes = [\n ...new Set([...collateralCoinTypes, ...debtCoinTypes]),\n ];\n const obligationCoinNames = obligationCoinTypes.map((coinType) => {\n return this.parseCoinNameFromType(coinType);\n });\n return obligationCoinNames;\n }\n\n /**\n * Get asset coin price.\n *\n * @description\n * The strategy for obtaining the price is to get it through API first,\n * and then on-chain data if API cannot be retrieved.\n * Currently, we only support obtaining from pyth protocol, other\n * oracles will be supported in the future.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @return Asset coin price.\n */\n public async getCoinPrices(assetCoinNames?: SupportAssetCoins[]) {\n assetCoinNames =\n assetCoinNames ||\n ([\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ] as SupportAssetCoins[]);\n\n const coinPrices: CoinPrices = {};\n const existPricesCoinNames: SupportAssetCoins[] = [];\n const lackPricesCoinNames: SupportAssetCoins[] = [];\n\n assetCoinNames.forEach((assetCoinName) => {\n if (\n this._priceMap.has(assetCoinName) &&\n Date.now() - this._priceMap.get(assetCoinName)!.publishTime < 1000 * 60\n ) {\n existPricesCoinNames.push(assetCoinName);\n } else {\n lackPricesCoinNames.push(assetCoinName);\n }\n });\n\n if (existPricesCoinNames.length > 0) {\n for (const coinName of existPricesCoinNames) {\n coinPrices[coinName] = this._priceMap.get(coinName)!.price;\n }\n }\n\n if (lackPricesCoinNames.length > 0) {\n const pythConnection = new SuiPriceServiceConnection(\n this.isTestnet\n ? 'https://hermes-beta.pyth.network'\n : 'https://hermes.pyth.network'\n );\n const priceIds = lackPricesCoinNames.map((coinName) =>\n this._address.get(`core.coins.${coinName}.oracle.pyth.feed`)\n );\n try {\n const priceFeeds =\n (await pythConnection.getLatestPriceFeeds(priceIds)) || [];\n for (const [index, feed] of priceFeeds.entries()) {\n const data = parseDataFromPythPriceFeed(feed, this._address);\n const coinName = lackPricesCoinNames[index];\n this._priceMap.set(coinName, {\n price: data.price,\n publishTime: data.publishTime,\n });\n coinPrices[coinName] = data.price;\n }\n } catch (_e) {\n for (const coinName of lackPricesCoinNames) {\n const price = await this._query.getPriceFromPyth(coinName);\n this._priceMap.set(coinName, {\n price: price,\n publishTime: Date.now(),\n });\n coinPrices[coinName] = price;\n }\n }\n }\n\n return coinPrices;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The annual percentage rate (APR).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage yield (APY) for the given APR and compounding frequency.\n */\n public parseAprToApy(apr: number, compoundFrequency = 365) {\n return (1 + apr / compoundFrequency) ** compoundFrequency - 1;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The equivalent annual percentage yield (APY).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage rate (APR) for the given APY and compounding frequency.\n */\n public parseApyToApr(apy: number, compoundFrequency = 365) {\n return ((1 + apy) ** (1 / compoundFrequency) - 1) * compoundFrequency;\n }\n}\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID, SUPPORT_SPOOLS } from '../constants';\nimport {\n queryMarket,\n getObligations,\n queryObligation,\n getStakeAccounts,\n getStakePool,\n getStakeRewardPool,\n getPythPrice,\n getMarketPools,\n getMarketPool,\n getMarketCollaterals,\n getMarketCollateral,\n getSpools,\n getSpool,\n queryBorrowIncentivePools,\n queryBorrowIncentiveAccounts,\n getCoinAmounts,\n getCoinAmount,\n getMarketCoinAmounts,\n getMarketCoinAmount,\n getLendings,\n getLending,\n getObligationAccounts,\n getObligationAccount,\n getTotalValueLocked,\n} from '../queries';\nimport {\n ScallopQueryParams,\n ScallopInstanceParams,\n SupportStakeMarketCoins,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportMarketCoins,\n StakePools,\n StakeRewardPools,\n SupportBorrowIncentiveCoins,\n} from '../types';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ScallopIndexer } from './scallopIndexer';\n\n/**\n * @description\n * It provides methods for getting on-chain data from the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopQuery = new ScallopQuery(<parameters>);\n * await scallopQuery.init();\n * scallopQuery.<query functions>();\n * await scallopQuery.<query functions>();\n * ```\n */\nexport class ScallopQuery {\n public readonly params: ScallopQueryParams;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public utils: ScallopUtils;\n public indexer: ScallopIndexer;\n\n public constructor(\n params: ScallopQueryParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this,\n });\n this.indexer = new ScallopIndexer();\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.utils.init(forece);\n }\n\n /* ==================== Core Query Methods ==================== */\n\n /**\n * Query market data.\n * @param indexer - Whether to use indexer.\n * @return Market data.\n */\n public async queryMarket(indexer: boolean = false) {\n return await queryMarket(this, indexer);\n }\n\n /**\n * Get market pools.\n *\n * @description\n * To obtain all market pools at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pools data.\n */\n public async getMarketPools(\n poolCoinNames?: SupportPoolCoins[],\n indexer: boolean = false\n ) {\n return await getMarketPools(this, poolCoinNames, indexer);\n }\n\n /**\n * Get market pool\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pool data.\n */\n public async getMarketPool(\n poolCoinName: SupportPoolCoins,\n indexer: boolean = false\n ) {\n return await getMarketPool(this, poolCoinName, indexer);\n }\n\n /**\n * Get market collaterals.\n *\n * @description\n * To obtain all market collaterals at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collaterals data.\n */\n public async getMarketCollaterals(\n collateralCoinNames?: SupportCollateralCoins[],\n indexer: boolean = false\n ) {\n return await getMarketCollaterals(this, collateralCoinNames, indexer);\n }\n\n /**\n * Get market collateral\n *\n * @param collateralCoinName - Specific support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collateral data.\n */\n public async getMarketCollateral(\n collateralCoinName: SupportCollateralCoins,\n indexer: boolean = false\n ) {\n return await getMarketCollateral(this, collateralCoinName, indexer);\n }\n\n /**\n * Get obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n return await getObligations(this, ownerAddress);\n }\n\n /**\n * Query obligation data.\n *\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\n public async queryObligation(obligationId: string) {\n return queryObligation(this, obligationId);\n }\n\n /**\n * Get all asset coin amounts.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All coin amounts.\n */\n public async getCoinAmounts(\n assetCoinNames?: SupportAssetCoins[],\n ownerAddress?: string\n ) {\n return await getCoinAmounts(this, assetCoinNames, ownerAddress);\n }\n\n /**\n * Get asset coin amount.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Coin amount.\n */\n public async getCoinAmount(\n assetCoinName: SupportAssetCoins,\n ownerAddress?: string\n ) {\n return await getCoinAmount(this, assetCoinName, ownerAddress);\n }\n\n /**\n * Get all market coin amounts.\n *\n * @param coinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All market market coin amounts.\n */\n public async getMarketCoinAmounts(\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress?: string\n ) {\n return await getMarketCoinAmounts(this, marketCoinNames, ownerAddress);\n }\n\n /**\n * Get market coin amount.\n *\n * @param coinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Market market coin amount.\n */\n public async getMarketCoinAmount(\n marketCoinName: SupportMarketCoins,\n ownerAddress?: string\n ) {\n return await getMarketCoinAmount(this, marketCoinName, ownerAddress);\n }\n\n /**\n * Get price from pyth fee object.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\n public async getPriceFromPyth(assetCoinName: SupportAssetCoins) {\n return await getPythPrice(this, assetCoinName);\n }\n\n /* ==================== Spool Query Methods ==================== */\n\n /**\n * Get spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spools data.\n */\n public async getSpools(\n stakeMarketCoinNames?: SupportStakeMarketCoins[],\n indexer: boolean = false\n ) {\n return await getSpools(this, stakeMarketCoinNames, indexer);\n }\n\n /**\n * Get spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spool data.\n */\n public async getSpool(\n stakeMarketCoinName: SupportStakeMarketCoins,\n indexer: boolean = false\n ) {\n return await getSpool(this, stakeMarketCoinName, indexer);\n }\n\n /**\n * Get stake accounts data for all stake pools (spools).\n *\n * @param ownerAddress - The owner address.\n * @return All Stake accounts data.\n */\n public async getAllStakeAccounts(ownerAddress?: string) {\n return await getStakeAccounts(this, ownerAddress);\n }\n\n /**\n * Get stake accounts data for specific stake pool (spool).\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n public async getStakeAccounts(\n stakeMarketCoinName: SupportStakeMarketCoins,\n ownerAddress?: string\n ) {\n const allStakeAccount = await this.getAllStakeAccounts(ownerAddress);\n return allStakeAccount[stakeMarketCoinName] ?? [];\n }\n\n /**\n * Get stake pools (spools) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Stake pools data.\n */\n public async getStakePools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n stakeMarketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakePools: StakePools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakePool = await getStakePool(this, stakeMarketCoinName);\n\n if (stakePool) {\n stakePools[stakeMarketCoinName] = stakePool;\n }\n }\n\n return stakePools;\n }\n\n /**\n * Get stake pool (spool) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get all spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\n public async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return await getStakePool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake reward pools data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of stake market coin name.\n * @return Stake reward pools data.\n */\n public async getStakeRewardPools(\n stakeMarketCoinNames?: SupportStakeMarketCoins[]\n ) {\n stakeMarketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakeRewardPools: StakeRewardPools = {};\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakeRewardPool = await getStakeRewardPool(\n this,\n stakeMarketCoinName\n );\n\n if (stakeRewardPool) {\n stakeRewardPools[stakeMarketCoinName] = stakeRewardPool;\n }\n }\n\n return stakeRewardPools;\n }\n\n /**\n * Get stake reward pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get spool data.\n *\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool data.\n */\n public async getStakeRewardPool(\n stakeMarketCoinName: SupportStakeMarketCoins\n ) {\n return await getStakeRewardPool(this, stakeMarketCoinName);\n }\n\n /**\n * Get borrow incentive pools data.\n *\n * @param coinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\n public async getBorrowIncentivePools(\n coinNames?: SupportBorrowIncentiveCoins[],\n indexer: boolean = false\n ) {\n return await queryBorrowIncentivePools(this, coinNames, indexer);\n }\n\n /**\n * Get borrow incentive accounts data.\n *\n * @param coinNames - Specific support borrow incentive coin name.\n * @param ownerAddress - The owner address.\n * @return Borrow incentive accounts data.\n */\n public async getBorrowIncentiveAccounts(\n obligationId: string,\n coinNames?: SupportBorrowIncentiveCoins[]\n ) {\n return await queryBorrowIncentiveAccounts(this, obligationId, coinNames);\n }\n\n /**\n * Get user lending and spool infomation for specific pools.\n *\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All lending and spool infomation.\n */\n public async getLendings(\n poolCoinNames?: SupportPoolCoins[],\n ownerAddress?: string,\n indexer: boolean = false\n ) {\n return await getLendings(this, poolCoinNames, ownerAddress, indexer);\n }\n\n /**\n * Get user lending and spool information for specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return Lending pool data.\n */\n public async getLending(\n poolCoinName: SupportPoolCoins,\n ownerAddress?: string,\n indexer: boolean = false\n ) {\n return await getLending(this, poolCoinName, ownerAddress, indexer);\n }\n\n /**\n * Get user all obligation accounts information.\n *\n * @description\n * All collateral and borrowing information in all obligation accounts owned by the user.\n *\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All obligation accounts information.\n */\n public async getObligationAccounts(\n ownerAddress?: string,\n indexer: boolean = false\n ) {\n return await getObligationAccounts(this, ownerAddress, indexer);\n }\n\n /**\n * Get obligation account information for specific id.\n *\n * @description\n * borrowing and obligation information for specific pool.\n *\n * @param obligationId - The obligation id.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return Borrowing and collateral information.\n */\n public async getObligationAccount(\n obligationId: string,\n ownerAddress?: string,\n indexer: boolean = false\n ) {\n return await getObligationAccount(\n this,\n obligationId,\n ownerAddress,\n indexer\n );\n }\n\n /**\n * Get total value locked.\n *\n * @param indexer - Whether to use indexer.\n * @description\n * Include total supplied value and total borrowed value.\n *\n * @return Total value locked.\n */\n public async getTvl(indexer: boolean = false) {\n return await getTotalValueLocked(this, indexer);\n }\n}\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport BigNumber from 'bignumber.js';\nimport {\n SUPPORT_POOLS,\n PROTOCOL_OBJECT_ID,\n SUPPORT_COLLATERALS,\n BORROW_FEE_PROTOCOL_ID,\n} from '../constants';\nimport {\n parseOriginMarketPoolData,\n calculateMarketPoolData,\n parseOriginMarketCollateralData,\n calculateMarketCollateralData,\n} from '../utils';\nimport type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopQuery } from '../models';\nimport {\n Market,\n MarketPools,\n MarketPool,\n MarketCollaterals,\n MarketCollateral,\n MarketQueryInterface,\n SupportAssetCoins,\n SupportPoolCoins,\n SupportCollateralCoins,\n ObligationQueryInterface,\n Obligation,\n InterestModel,\n BorrowIndex,\n BalanceSheet,\n RiskModel,\n CollateralStat,\n CoinAmounts,\n MarketCoinAmounts,\n SupportMarketCoins,\n} from '../types';\n\n/**\n * Query market data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param indexer - Whether to use indexer.\n * @return Market data.\n */\nexport const queryMarket = async (\n query: ScallopQuery,\n indexer: boolean = false\n) => {\n const packageId = query.address.get('core.packages.query.id');\n const marketId = query.address.get('core.market');\n const txBlock = new SuiKitTxBlock();\n const queryTarget = `${packageId}::market_query::market_data`;\n txBlock.moveCall(queryTarget, [marketId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const marketData = queryResult.events[0].parsedJson as MarketQueryInterface;\n const coinPrices = await query.utils.getCoinPrices();\n\n const pools: MarketPools = {};\n const collaterals: MarketCollaterals = {};\n\n if (indexer) {\n const marketIndexer = await query.indexer.getMarket();\n for (const pool of Object.values(marketIndexer.pools)) {\n pool.coinPrice = coinPrices[pool.coinName] || pool.coinPrice;\n pool.coinWrappedType = query.utils.getCoinWrappedType(pool.coinName);\n }\n for (const collateral of Object.values(marketIndexer.collaterals)) {\n collateral.coinPrice =\n coinPrices[collateral.coinName] || collateral.coinPrice;\n collateral.coinWrappedType = query.utils.getCoinWrappedType(\n collateral.coinName\n );\n }\n return {\n pools: marketIndexer.pools,\n collaterals: marketIndexer.collaterals,\n };\n }\n\n for (const pool of marketData.pools) {\n const coinType = normalizeStructTag(pool.type.name);\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportPoolCoins>(coinType);\n const coinPrice = coinPrices[poolCoinName] ?? 0;\n\n // Filter pools not yet supported by the SDK.\n if (!SUPPORT_POOLS.includes(poolCoinName)) {\n continue;\n }\n\n const parsedMarketPoolData = parseOriginMarketPoolData({\n type: pool.type,\n maxBorrowRate: pool.maxBorrowRate,\n interestRate: pool.interestRate,\n interestRateScale: pool.interestRateScale,\n borrowIndex: pool.borrowIndex,\n lastUpdated: pool.lastUpdated,\n cash: pool.cash,\n debt: pool.debt,\n marketCoinSupply: pool.marketCoinSupply,\n reserve: pool.reserve,\n reserveFactor: pool.reserveFactor,\n borrowWeight: pool.borrowWeight,\n borrowFeeRate: pool.borrowFeeRate,\n baseBorrowRatePerSec: pool.baseBorrowRatePerSec,\n borrowRateOnHighKink: pool.borrowRateOnHighKink,\n borrowRateOnMidKink: pool.borrowRateOnMidKink,\n highKink: pool.highKink,\n midKink: pool.midKink,\n minBorrowAmount: pool.minBorrowAmount,\n });\n\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n\n pools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinDecimal: query.utils.getCoinDecimal(poolCoinName),\n coinPrice: coinPrice,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n };\n }\n\n for (const collateral of marketData.collaterals) {\n const coinType = normalizeStructTag(collateral.type.name);\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(coinType);\n const coinPrice = coinPrices[collateralCoinName] ?? 0;\n\n // Filter collaterals not yet supported by the SDK.\n if (!SUPPORT_COLLATERALS.includes(collateralCoinName)) {\n continue;\n }\n\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: collateral.type,\n collateralFactor: collateral.collateralFactor,\n liquidationFactor: collateral.collateralFactor,\n liquidationDiscount: collateral.liquidationDiscount,\n liquidationPanelty: collateral.liquidationPanelty,\n liquidationReserveFactor: collateral.liquidationReserveFactor,\n maxCollateralAmount: collateral.maxCollateralAmount,\n totalCollateralAmount: collateral.totalCollateralAmount,\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n collaterals[collateralCoinName] = {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: coinType,\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinDecimal: query.utils.getCoinDecimal(collateralCoinName),\n coinPrice: coinPrice,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculatedMarketCollateralData,\n };\n }\n\n return {\n pools,\n collaterals,\n data: marketData,\n } as Market;\n};\n\n/**\n * Get coin market pools data.\n *\n * @description\n * To obtain all market pools information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param coinNames - Specific an array of support pool coin name.\n * @param indexer - Whether to use indexer.\n * @return Market pools data.\n */\nexport const getMarketPools = async (\n query: ScallopQuery,\n poolCoinNames?: SupportPoolCoins[],\n indexer: boolean = false\n) => {\n poolCoinNames = poolCoinNames || [...SUPPORT_POOLS];\n const marketId = query.address.get('core.market');\n const marketObjectResponse = await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n });\n const coinPrices = await query.utils.getCoinPrices(poolCoinNames ?? []);\n\n const marketPools: MarketPools = {};\n\n if (indexer) {\n const marketPoolsIndexer = await query.indexer.getMarketPools();\n for (const marketPool of Object.values(marketPoolsIndexer)) {\n if (!poolCoinNames.includes(marketPool.coinName)) continue;\n marketPool.coinPrice =\n coinPrices[marketPool.coinName] || marketPool.coinPrice;\n marketPool.coinWrappedType = query.utils.getCoinWrappedType(\n marketPool.coinName\n );\n marketPools[marketPool.coinName] = marketPool;\n }\n\n return marketPools;\n }\n\n for (const poolCoinName of poolCoinNames) {\n const marketPool = await getMarketPool(\n query,\n poolCoinName,\n indexer,\n marketObjectResponse.data,\n coinPrices?.[poolCoinName]\n );\n\n if (marketPool) {\n marketPools[poolCoinName] = marketPool;\n }\n }\n\n return marketPools;\n};\n\n/**\n * Get market pool data.\n *\n * @param query - The Scallop query instance.\n * @param poolCoinName - Specific support pool coin name.\n * @param indexer - Whether to use indexer.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market pool data.\n */\nexport const getMarketPool = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n indexer: boolean = false,\n marketObject?: SuiObjectData | null,\n coinPrice?: number\n) => {\n const marketId = query.address.get('core.market');\n marketObject =\n marketObject ||\n (\n await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n })\n ).data;\n\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];\n\n let marketPool: MarketPool | undefined;\n let balanceSheet: BalanceSheet | undefined;\n let borrowIndex: BorrowIndex | undefined;\n let interestModel: InterestModel | undefined;\n let borrowFeeRate: { value: string } | undefined;\n\n if (indexer) {\n const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);\n marketPoolIndexer.coinPrice = coinPrice || marketPoolIndexer.coinPrice;\n marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(\n marketPoolIndexer.coinName\n );\n\n return marketPoolIndexer;\n }\n\n if (marketObject) {\n if (marketObject.content && 'fields' in marketObject.content) {\n const fields = marketObject.content.fields as any;\n const coinType = query.utils.parseCoinType(poolCoinName);\n\n // Get balance sheet.\n const balanceSheetParentId =\n fields.vault.fields.balance_sheets.fields.table.fields.id.id;\n const balanceSheetDdynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: balanceSheetParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const balanceSheetDdynamicFieldObject =\n balanceSheetDdynamicFieldObjectResponse.data;\n if (\n balanceSheetDdynamicFieldObject &&\n balanceSheetDdynamicFieldObject.content &&\n 'fields' in balanceSheetDdynamicFieldObject.content\n ) {\n const dynamicFields = balanceSheetDdynamicFieldObject.content\n .fields as any;\n balanceSheet = dynamicFields.value.fields;\n }\n\n // Get borrow index.\n const borrowIndexParentId =\n fields.borrow_dynamics.fields.table.fields.id.id;\n const borrowIndexDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: borrowIndexParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const borrowIndexDynamicFieldObject =\n borrowIndexDynamicFieldObjectResponse.data;\n if (\n borrowIndexDynamicFieldObject &&\n borrowIndexDynamicFieldObject.content &&\n 'fields' in borrowIndexDynamicFieldObject.content\n ) {\n const dynamicFields = borrowIndexDynamicFieldObject.content\n .fields as any;\n borrowIndex = dynamicFields.value.fields;\n }\n\n // Get interest models.\n const interestModelParentId =\n fields.interest_models.fields.table.fields.id.id;\n const interestModelDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: interestModelParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const interestModelDynamicFieldObject =\n interestModelDynamicFieldObjectResponse.data;\n if (\n interestModelDynamicFieldObject &&\n interestModelDynamicFieldObject.content &&\n 'fields' in interestModelDynamicFieldObject.content\n ) {\n const dynamicFields = interestModelDynamicFieldObject.content\n .fields as any;\n interestModel = dynamicFields.value.fields;\n }\n\n // Get borrow fee.\n const borrowFeeDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: marketId,\n name: {\n type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,\n value: {\n type: {\n name: coinType.substring(2),\n },\n },\n },\n });\n\n const borrowFeeDynamicFieldObject =\n borrowFeeDynamicFieldObjectResponse.data;\n if (\n borrowFeeDynamicFieldObject &&\n borrowFeeDynamicFieldObject.content &&\n 'fields' in borrowFeeDynamicFieldObject.content\n ) {\n const dynamicFields = borrowFeeDynamicFieldObject.content.fields as any;\n borrowFeeRate = dynamicFields.value.fields;\n }\n }\n }\n\n if (balanceSheet && borrowIndex && interestModel && borrowFeeRate) {\n const parsedMarketPoolData = parseOriginMarketPoolData({\n type: interestModel.type.fields,\n maxBorrowRate: interestModel.max_borrow_rate.fields,\n interestRate: borrowIndex.interest_rate.fields,\n interestRateScale: borrowIndex.interest_rate_scale,\n borrowIndex: borrowIndex.borrow_index,\n lastUpdated: borrowIndex.last_updated,\n cash: balanceSheet.cash,\n debt: balanceSheet.debt,\n marketCoinSupply: balanceSheet.market_coin_supply,\n reserve: balanceSheet.revenue,\n reserveFactor: interestModel.revenue_factor.fields,\n borrowWeight: interestModel.borrow_weight.fields,\n borrowFeeRate: borrowFeeRate,\n baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,\n borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,\n borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,\n highKink: interestModel.high_kink.fields,\n midKink: interestModel.mid_kink.fields,\n minBorrowAmount: interestModel.min_borrow_amount,\n });\n\n const calculatedMarketPoolData = calculateMarketPoolData(\n query.utils,\n parsedMarketPoolData\n );\n\n marketPool = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),\n coinDecimal: query.utils.getCoinDecimal(poolCoinName),\n coinPrice: coinPrice ?? 0,\n highKink: parsedMarketPoolData.highKink,\n midKink: parsedMarketPoolData.midKink,\n reserveFactor: parsedMarketPoolData.reserveFactor,\n borrowWeight: parsedMarketPoolData.borrowWeight,\n borrowFee: parsedMarketPoolData.borrowFee,\n marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,\n minBorrowAmount: parsedMarketPoolData.minBorrowAmount,\n ...calculatedMarketPoolData,\n };\n }\n\n return marketPool;\n};\n\n/**\n * Get coin market collaterals data.\n *\n * @description\n * To obtain all market collaterals information at once, it is recommended to use\n * the `queryMarket` method to reduce time consumption.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinNames - Specific an array of support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @return Market collaterals data.\n */\nexport const getMarketCollaterals = async (\n query: ScallopQuery,\n collateralCoinNames?: SupportCollateralCoins[],\n indexer: boolean = false\n) => {\n collateralCoinNames = collateralCoinNames || [...SUPPORT_COLLATERALS];\n const marketId = query.address.get('core.market');\n const marketObjectResponse = await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n });\n const coinPrices = await query.utils.getCoinPrices(collateralCoinNames ?? []);\n\n const marketCollaterals: MarketCollaterals = {};\n\n if (indexer) {\n const marketCollateralsIndexer = await query.indexer.getMarketCollaterals();\n for (const marketCollateral of Object.values(marketCollateralsIndexer)) {\n if (!collateralCoinNames.includes(marketCollateral.coinName)) continue;\n marketCollateral.coinPrice =\n coinPrices[marketCollateral.coinName] || marketCollateral.coinPrice;\n marketCollateral.coinWrappedType = query.utils.getCoinWrappedType(\n marketCollateral.coinName\n );\n marketCollaterals[marketCollateral.coinName] = marketCollateral;\n }\n return marketCollaterals;\n }\n\n for (const collateralCoinName of collateralCoinNames) {\n const marketCollateral = await getMarketCollateral(\n query,\n collateralCoinName,\n indexer,\n marketObjectResponse.data,\n coinPrices?.[collateralCoinName]\n );\n\n if (marketCollateral) {\n marketCollaterals[collateralCoinName] = marketCollateral;\n }\n }\n\n return marketCollaterals;\n};\n\n/**\n * Get market collateral data.\n *\n * @param query - The Scallop query instance.\n * @param collateralCoinName - Specific support collateral coin name.\n * @param indexer - Whether to use indexer.\n * @param marketObject - The market object.\n * @param coinPrice - The coin price.\n * @returns Market collateral data.\n */\nexport const getMarketCollateral = async (\n query: ScallopQuery,\n collateralCoinName: SupportCollateralCoins,\n indexer: boolean = false,\n marketObject?: SuiObjectData | null,\n coinPrice?: number\n) => {\n const marketId = query.address.get('core.market');\n marketObject =\n marketObject ||\n (\n await query.suiKit.client().getObject({\n id: marketId,\n options: {\n showContent: true,\n },\n })\n ).data;\n\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([collateralCoinName]))?.[\n collateralCoinName\n ];\n\n let marketCollateral: MarketCollateral | undefined;\n let riskModel: RiskModel | undefined;\n let collateralStat: CollateralStat | undefined;\n\n if (indexer) {\n const marketCollateralIndexer =\n await query.indexer.getMarketCollateral(collateralCoinName);\n marketCollateralIndexer.coinPrice =\n coinPrice || marketCollateralIndexer.coinPrice;\n marketCollateralIndexer.coinWrappedType = query.utils.getCoinWrappedType(\n marketCollateralIndexer.coinName\n );\n\n return marketCollateralIndexer;\n }\n\n if (marketObject) {\n if (marketObject.content && 'fields' in marketObject.content) {\n const fields = marketObject.content.fields as any;\n const coinType = query.utils.parseCoinType(collateralCoinName);\n\n // Get risk model.\n const riskModelParentId = fields.risk_models.fields.table.fields.id.id;\n const riskModelDdynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: riskModelParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const riskModelDdynamicFieldObject =\n riskModelDdynamicFieldObjectResponse.data;\n if (\n riskModelDdynamicFieldObject &&\n riskModelDdynamicFieldObject.content &&\n 'fields' in riskModelDdynamicFieldObject.content\n ) {\n const dynamicFields = riskModelDdynamicFieldObject.content\n .fields as any;\n riskModel = dynamicFields.value.fields;\n }\n\n // Get collateral stat.\n const collateralStatParentId =\n fields.collateral_stats.fields.table.fields.id.id;\n const collateralStatDynamicFieldObjectResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: collateralStatParentId,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: coinType.substring(2),\n },\n },\n });\n const collateralStatDynamicFieldObject =\n collateralStatDynamicFieldObjectResponse.data;\n if (\n collateralStatDynamicFieldObject &&\n collateralStatDynamicFieldObject.content &&\n 'fields' in collateralStatDynamicFieldObject.content\n ) {\n const dynamicFields = collateralStatDynamicFieldObject.content\n .fields as any;\n collateralStat = dynamicFields.value.fields;\n }\n }\n }\n\n if (riskModel && collateralStat) {\n const parsedMarketCollateralData = parseOriginMarketCollateralData({\n type: riskModel.type.fields,\n collateralFactor: riskModel.collateral_factor.fields,\n liquidationFactor: riskModel.liquidation_factor.fields,\n liquidationDiscount: riskModel.liquidation_discount.fields,\n liquidationPanelty: riskModel.liquidation_penalty.fields,\n liquidationReserveFactor: riskModel.liquidation_revenue_factor.fields,\n maxCollateralAmount: riskModel.max_collateral_amount,\n totalCollateralAmount: collateralStat.amount,\n });\n\n const calculatedMarketCollateralData = calculateMarketCollateralData(\n query.utils,\n parsedMarketCollateralData\n );\n\n marketCollateral = {\n coinName: collateralCoinName,\n symbol: query.utils.parseSymbol(collateralCoinName),\n coinType: query.utils.parseCoinType(collateralCoinName),\n marketCoinType: query.utils.parseMarketCoinType(collateralCoinName),\n coinWrappedType: query.utils.getCoinWrappedType(collateralCoinName),\n coinDecimal: query.utils.getCoinDecimal(collateralCoinName),\n coinPrice: coinPrice ?? 0,\n collateralFactor: parsedMarketCollateralData.collateralFactor,\n liquidationFactor: parsedMarketCollateralData.liquidationFactor,\n liquidationDiscount: parsedMarketCollateralData.liquidationDiscount,\n liquidationPanelty: parsedMarketCollateralData.liquidationPanelty,\n liquidationReserveFactor:\n parsedMarketCollateralData.liquidationReserveFactor,\n ...calculatedMarketCollateralData,\n };\n }\n\n return marketCollateral;\n};\n\n/**\n * Query all owned obligations.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned obligations.\n */\nexport const getObligations = async (\n query: ScallopQuery,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const protocolObjectId =\n query.address.get('core.object') || PROTOCOL_OBJECT_ID;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedKeyObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n StructType: `${protocolObjectId}::obligation::ObligationKey`,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (\n paginatedKeyObjectsResponse.hasNextPage &&\n paginatedKeyObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const keyObjectIds: string[] = keyObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const keyObjects = await query.suiKit.getObjects(keyObjectIds);\n const obligations: Obligation[] = [];\n for (const keyObject of keyObjects) {\n const keyId = keyObject.objectId;\n if (keyObject.content && 'fields' in keyObject.content) {\n const fields = keyObject.content.fields as any;\n const obligationId = String(fields.ownership.fields.of);\n const locked = await getObligationLocked(query, obligationId);\n obligations.push({ id: obligationId, keyId, locked });\n }\n }\n return obligations;\n};\n\n/**\n * Query obligation locked status.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation locked status.\n */\nexport const getObligationLocked = async (\n query: ScallopQuery,\n obligationId: string\n) => {\n const obligationObjectResponse = await query.suiKit.client().getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectResponse.data &&\n obligationObjectResponse?.data?.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectResponse.data.content.fields\n ) {\n obligationLocked = Boolean(\n obligationObjectResponse.data.content.fields.lock_key\n );\n }\n\n return obligationLocked;\n};\n\n/**\n * Query obligation data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\nexport const queryObligation = async (\n query: ScallopQuery,\n obligationId: SuiAddressArg\n) => {\n const packageId = query.address.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data`;\n const txBlock = new SuiKitTxBlock();\n txBlock.moveCall(queryTarget, [obligationId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n return queryResult.events[0].parsedJson as ObligationQueryInterface;\n};\n\n/**\n * Query all owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All owned coin amounts.\n */\nexport const getCoinAmounts = async (\n query: ScallopQuery,\n assetCoinNames?: SupportAssetCoins[],\n ownerAddress?: string\n) => {\n assetCoinNames = assetCoinNames || [...SUPPORT_POOLS];\n const owner = ownerAddress || query.suiKit.currentAddress();\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n MatchAny: assetCoinNames.map((assetCoinName) => {\n const coinType = query.utils.parseCoinType(assetCoinName);\n return { StructType: `0x2::coin::Coin<${coinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (\n paginatedCoinObjectsResponse.hasNextPage &&\n paginatedCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const coinAmounts: CoinAmounts = {};\n const coinObjects = coinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const coinObject of coinObjects) {\n const type = coinObject.type as string;\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n const poolCoinName =\n query.utils.parseCoinNameFromType<SupportPoolCoins>(type);\n if (poolCoinName) {\n coinAmounts[poolCoinName] = BigNumber(coinAmounts[poolCoinName] ?? 0)\n .plus(fields.balance)\n .toNumber();\n }\n }\n }\n return coinAmounts;\n};\n\n/**\n * Query owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Owned coin amount.\n */\nexport const getCoinAmount = async (\n query: ScallopQuery,\n assetCoinName: SupportAssetCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const coinType = query.utils.parseCoinType(assetCoinName);\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${coinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (\n paginatedCoinObjectsResponse.hasNextPage &&\n paginatedCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n let coinAmount: number = 0;\n const coinObjects = coinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const coinObject of coinObjects) {\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n coinAmount = BigNumber(coinAmount).plus(fields.balance).toNumber();\n }\n }\n return coinAmount;\n};\n\n/**\n * Query all owned market coins (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All owned market coins amount.\n */\nexport const getMarketCoinAmounts = async (\n query: ScallopQuery,\n marketCoinNames?: SupportMarketCoins[],\n ownerAddress?: string\n) => {\n marketCoinNames =\n marketCoinNames ||\n [...SUPPORT_POOLS].map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const owner = ownerAddress || query.suiKit.currentAddress();\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: {\n MatchAny: marketCoinNames.map((marketCoinName) => {\n const marketCoinType =\n query.utils.parseMarketCoinType(marketCoinName);\n return { StructType: `0x2::coin::Coin<${marketCoinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (\n paginatedMarketCoinObjectsResponse.hasNextPage &&\n paginatedMarketCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const marketCoinAmounts: MarketCoinAmounts = {};\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const marketCoinObject of marketCoinObjects) {\n const marketCoinType = marketCoinObject.type as string;\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n const marketCoinName =\n query.utils.parseCoinNameFromType<SupportMarketCoins>(marketCoinType);\n if (marketCoinName) {\n marketCoinAmounts[marketCoinName] = BigNumber(\n marketCoinAmounts[marketCoinName] ?? 0\n )\n .plus(fields.balance)\n .toNumber();\n }\n }\n }\n return marketCoinAmounts;\n};\n\n/**\n * Query owned market coin (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Owned market coin amount.\n */\nexport const getMarketCoinAmount = async (\n query: ScallopQuery,\n marketCoinName: SupportMarketCoins,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${marketCoinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (\n paginatedMarketCoinObjectsResponse.hasNextPage &&\n paginatedMarketCoinObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n let marketCoinAmount: number = 0;\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => {\n return response.data;\n })\n .filter(\n (object: any) => object !== undefined && object !== null\n ) as SuiObjectData[];\n for (const marketCoinObject of marketCoinObjects) {\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n marketCoinAmount = BigNumber(marketCoinAmount)\n .plus(fields.balance)\n .toNumber();\n }\n }\n return marketCoinAmount;\n};\n","import type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\n\n/**\n * Check and get the sender from the transaction block.\n *\n * @param txBlock - TxBlock created by SuiKit.\n * @return Sender of transaction.\n */\nexport const requireSender = (txBlock: SuiKitTxBlock) => {\n const sender = txBlock.blockData.sender;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n","import BigNumber from 'bignumber.js';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\nimport type { ScallopUtils } from '../models';\nimport type {\n OriginMarketPoolData,\n ParsedMarketPoolData,\n CalculatedMarketPoolData,\n OriginMarketCollateralData,\n ParsedMarketCollateralData,\n CalculatedMarketCollateralData,\n OriginSpoolData,\n ParsedSpoolData,\n CalculatedSpoolData,\n OriginSpoolRewardPoolData,\n ParsedSpoolRewardPoolData,\n CalculatedSpoolRewardPoolData,\n OriginBorrowIncentivePoolData,\n ParsedBorrowIncentivePoolData,\n CalculatedBorrowIncentivePoolData,\n OriginBorrowIncentiveRewardPoolData,\n ParsedBorrowIncentiveRewardPoolData,\n CalculatedBorrowIncentiveRewardPoolData,\n OriginBorrowIncentiveAccountData,\n ParsedBorrowIncentiveAccountData,\n SupportPoolCoins,\n SupportCollateralCoins,\n} from '../types';\n\n/**\n * Parse origin market pool data to a more readable format.\n *\n * @param originMarketPoolData - Origin market pool data\n * @return Parsed market pool data\n */\nexport const parseOriginMarketPoolData = (\n originMarketPoolData: OriginMarketPoolData\n): ParsedMarketPoolData => {\n return {\n coinType: normalizeStructTag(originMarketPoolData.type.name),\n // Parse origin data required for basic calculations.\n maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,\n borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,\n borrowRateScale: Number(originMarketPoolData.interestRateScale),\n borrowIndex: Number(originMarketPoolData.borrowIndex),\n lastUpdated: Number(originMarketPoolData.lastUpdated),\n cashAmount: Number(originMarketPoolData.cash),\n debtAmount: Number(originMarketPoolData.debt),\n marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),\n reserveAmount: Number(originMarketPoolData.reserve),\n reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,\n borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,\n borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,\n // Parse origin data required for additional display.\n baseBorrowRate:\n Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,\n borrowRateOnHighKink:\n Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,\n borrowRateOnMidKink:\n Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,\n highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,\n midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,\n minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),\n };\n};\n\nexport const calculateMarketPoolData = (\n utils: ScallopUtils,\n parsedMarketPoolData: ParsedMarketPoolData\n): CalculatedMarketPoolData => {\n const poolCoinName = utils.parseCoinNameFromType<SupportPoolCoins>(\n parsedMarketPoolData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(poolCoinName);\n\n const borrowYearFactor = 24 * 365 * 3600;\n\n const baseBorrowApr =\n (parsedMarketPoolData.baseBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnHighKink =\n (parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowAprOnMidKink =\n (parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const maxBorrowApr =\n (parsedMarketPoolData.maxBorrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n const borrowApr =\n (parsedMarketPoolData.borrowRate * borrowYearFactor) /\n parsedMarketPoolData.borrowRateScale;\n\n const timeDelta =\n Math.floor(new Date().getTime() / 1000) - parsedMarketPoolData.lastUpdated;\n const borrowIndexDelta = BigNumber(parsedMarketPoolData.borrowIndex)\n .multipliedBy(\n BigNumber(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate)\n )\n .dividedBy(parsedMarketPoolData.borrowRateScale);\n const currentBorrowIndex = BigNumber(parsedMarketPoolData.borrowIndex).plus(\n borrowIndexDelta\n );\n // How much accumulated interest since `lastUpdate`.\n const growthInterest = BigNumber(currentBorrowIndex)\n .dividedBy(parsedMarketPoolData.borrowIndex)\n .minus(1);\n const increasedDebtAmount = BigNumber(\n parsedMarketPoolData.debtAmount\n ).multipliedBy(growthInterest);\n const borrowAmount = increasedDebtAmount.plus(\n parsedMarketPoolData.debtAmount\n );\n const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);\n const reserveAmount = BigNumber(parsedMarketPoolData.reserveAmount).plus(\n increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor)\n );\n const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);\n const supplyAmount = BigNumber(borrowAmount).plus(\n Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0)\n );\n const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);\n let utilizationRate = BigNumber(borrowAmount).dividedBy(supplyAmount);\n utilizationRate = utilizationRate.isFinite() ? utilizationRate : BigNumber(0);\n let supplyApr = BigNumber(borrowApr)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - parsedMarketPoolData.reserveFactor);\n supplyApr = supplyApr.isFinite() ? supplyApr : BigNumber(0);\n let conversionRate = supplyAmount.dividedBy(\n parsedMarketPoolData.marketCoinSupplyAmount\n );\n conversionRate =\n conversionRate.isFinite() && !conversionRate.isNaN()\n ? conversionRate\n : BigNumber(1);\n\n return {\n baseBorrowApr,\n baseBorrowApy: utils.parseAprToApy(baseBorrowApr),\n borrowAprOnHighKink,\n borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),\n borrowAprOnMidKink,\n borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),\n maxBorrowApr,\n maxBorrowApy: utils.parseAprToApy(maxBorrowApr),\n borrowApr: Math.min(borrowApr, maxBorrowApr),\n borrowApy: Math.min(\n utils.parseAprToApy(borrowApr),\n utils.parseAprToApy(maxBorrowApr)\n ),\n borrowIndex: currentBorrowIndex.toNumber(),\n growthInterest: growthInterest.toNumber(),\n supplyAmount: supplyAmount.toNumber(),\n supplyCoin: supplyCoin.toNumber(),\n borrowAmount: borrowAmount.toNumber(),\n borrowCoin: borrowCoin.toNumber(),\n reserveAmount: reserveAmount.toNumber(),\n reserveCoin: reserveCoin.toNumber(),\n utilizationRate: utilizationRate.toNumber(),\n supplyApr: supplyApr.toNumber(),\n supplyApy: utils.parseAprToApy(supplyApr.toNumber()),\n conversionRate: conversionRate.toNumber(),\n };\n};\n\n/**\n * Parse origin market collateral data to a more readable format.\n *\n * @param originMarketCollateralData - Origin market collateral data\n * @return Parsed market collateral data\n */\nexport const parseOriginMarketCollateralData = (\n originMarketCollateralData: OriginMarketCollateralData\n): ParsedMarketCollateralData => {\n return {\n coinType: normalizeStructTag(originMarketCollateralData.type.name),\n collateralFactor:\n Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,\n liquidationFactor:\n Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,\n liquidationDiscount:\n Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,\n liquidationPanelty:\n Number(originMarketCollateralData.liquidationPanelty.value) / 2 ** 32,\n liquidationReserveFactor:\n Number(originMarketCollateralData.liquidationReserveFactor.value) /\n 2 ** 32,\n maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),\n totalCollateralAmount: Number(\n originMarketCollateralData.totalCollateralAmount\n ),\n };\n};\n\nexport const calculateMarketCollateralData = (\n utils: ScallopUtils,\n parsedMarketCollateralData: ParsedMarketCollateralData\n): CalculatedMarketCollateralData => {\n const collateralCoinName =\n utils.parseCoinNameFromType<SupportCollateralCoins>(\n parsedMarketCollateralData.coinType\n );\n const coinDecimal = utils.getCoinDecimal(collateralCoinName);\n\n const maxCollateralCoin = BigNumber(\n parsedMarketCollateralData.maxCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n const depositCoin = BigNumber(\n parsedMarketCollateralData.totalCollateralAmount\n ).shiftedBy(-1 * coinDecimal);\n\n return {\n maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,\n maxDepositCoin: maxCollateralCoin.toNumber(),\n depositAmount: parsedMarketCollateralData.totalCollateralAmount,\n depositCoin: depositCoin.toNumber(),\n };\n};\n\n/**\n * Parse origin spool data to a more readable format.\n *\n * @param originSpoolData - Origin spool data\n * @return Parsed spool data\n */\nexport const parseOriginSpoolData = (\n originSpoolData: OriginSpoolData\n): ParsedSpoolData => {\n return {\n stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),\n maxPoint: Number(originSpoolData.maxDistributedPoint),\n distributedPoint: Number(originSpoolData.distributedPoint),\n pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),\n period: Number(originSpoolData.pointDistributionTime),\n maxStake: Number(originSpoolData.maxStake),\n staked: Number(originSpoolData.stakes),\n index: Number(originSpoolData.index),\n createdAt: Number(originSpoolData.createdAt),\n lastUpdate: Number(originSpoolData.lastUpdate),\n };\n};\n\nexport const calculateSpoolData = (\n parsedSpoolData: ParsedSpoolData,\n stakeMarketCoinPrice: number,\n stakeMarketCoinDecimal: number\n): CalculatedSpoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedSpoolData.pointPerPeriod\n ).dividedBy(parsedSpoolData.period);\n\n const pointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(\n parsedSpoolData.period\n );\n const remainingPeriod = BigNumber(parsedSpoolData.maxPoint)\n .minus(parsedSpoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedSpoolData.createdAt;\n const endDate = remainingPeriod\n .plus(parsedSpoolData.lastUpdate)\n .integerValue()\n .toNumber();\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) - parsedSpoolData.lastUpdate\n )\n .dividedBy(parsedSpoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(parsedSpoolData.maxPoint).minus(\n parsedSpoolData.distributedPoint\n );\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),\n remainingPoints\n );\n\n const currentPointIndex = BigNumber(parsedSpoolData.index).plus(\n accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedSpoolData.staked)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedSpoolData.distributedPoint\n ).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedSpoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin spool reward pool data to a more readable format.\n *\n * @param originRewardPoolData - Origin reward pool data\n * @return Parsed spool reward pool data\n */\nexport const parseOriginSpoolRewardPoolData = (\n originSpoolRewardPoolData: OriginSpoolRewardPoolData\n): ParsedSpoolRewardPoolData => {\n return {\n claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),\n exchangeRateDenominator: Number(\n originSpoolRewardPoolData.exchange_rate_denominator\n ),\n exchangeRateNumerator: Number(\n originSpoolRewardPoolData.exchange_rate_numerator\n ),\n feeRateDenominator: Number(originSpoolRewardPoolData.fee_rate_denominator),\n feeRateNumerator: Number(originSpoolRewardPoolData.fee_rate_numerator),\n rewards: Number(originSpoolRewardPoolData.rewards),\n spoolId: String(originSpoolRewardPoolData.spool_id),\n };\n};\n\nexport const calculateSpoolRewardPoolData = (\n parsedSpoolData: ParsedSpoolData,\n parsedSpoolRewardPoolData: ParsedSpoolRewardPoolData,\n calculatedSpoolData: CalculatedSpoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number\n): CalculatedSpoolRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(calculatedSpoolData.distributedPointPerSec)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedSpoolData.maxPoint)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(parsedSpoolRewardPoolData.rewards);\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(\n parsedSpoolRewardPoolData.claimedRewards\n );\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n const rewardRate = rewardValueForYear\n .dividedBy(calculatedSpoolData.stakedValue)\n .isFinite()\n ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber()\n : Infinity;\n const rewardFeeRate = BigNumber(parsedSpoolRewardPoolData.feeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.feeRateDenominator)\n .toNumber();\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n rewardFee: rewardFeeRate,\n };\n};\n\n/**\n * Parse origin borrow incentive pool data to a more readable format.\n *\n * @param originBorrowIncentivePoolData - Origin borrow incentive pool data\n * @return Parsed borrow incentive pool data\n */\nexport const parseOriginBorrowIncentivePoolData = (\n originBorrowIncentivePoolData: OriginBorrowIncentivePoolData\n): ParsedBorrowIncentivePoolData => {\n return {\n poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),\n maxPoint: Number(originBorrowIncentivePoolData.max_distributed_point),\n distributedPoint: Number(originBorrowIncentivePoolData.distributed_point),\n pointPerPeriod: Number(\n originBorrowIncentivePoolData.distributed_point_per_period\n ),\n period: Number(originBorrowIncentivePoolData.point_distribution_time),\n maxStake: Number(originBorrowIncentivePoolData.max_stakes),\n staked: Number(originBorrowIncentivePoolData.stakes),\n index: Number(originBorrowIncentivePoolData.index),\n createdAt: Number(originBorrowIncentivePoolData.created_at),\n lastUpdate: Number(originBorrowIncentivePoolData.last_update),\n };\n};\n\nexport const calculateBorrowIncentivePoolData = (\n parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,\n borrowIncentiveCoinPrice: number,\n borrowIncentiveCoinDecimal: number\n): CalculatedBorrowIncentivePoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ).dividedBy(parsedBorrowIncentivePoolData.period);\n\n const pointPerSec = BigNumber(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ).dividedBy(parsedBorrowIncentivePoolData.period);\n const remainingPeriod = BigNumber(parsedBorrowIncentivePoolData.maxPoint)\n .minus(parsedBorrowIncentivePoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedBorrowIncentivePoolData.createdAt;\n const endDate = remainingPeriod\n .plus(parsedBorrowIncentivePoolData.lastUpdate)\n .integerValue()\n .toNumber();\n\n const timeDelta = BigNumber(\n Math.floor(new Date().getTime() / 1000) -\n parsedBorrowIncentivePoolData.lastUpdate\n )\n .dividedBy(parsedBorrowIncentivePoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(\n parsedBorrowIncentivePoolData.maxPoint\n ).minus(parsedBorrowIncentivePoolData.distributedPoint);\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(\n parsedBorrowIncentivePoolData.pointPerPeriod\n ),\n remainingPoints\n );\n\n const currentPointIndex = BigNumber(parsedBorrowIncentivePoolData.index).plus(\n accumulatedPoints.dividedBy(parsedBorrowIncentivePoolData.staked).isFinite()\n ? BigNumber(baseIndexRate)\n .multipliedBy(accumulatedPoints)\n .dividedBy(parsedBorrowIncentivePoolData.staked)\n : 0\n );\n const currentTotalDistributedPoint = BigNumber(\n parsedBorrowIncentivePoolData.distributedPoint\n ).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedBorrowIncentivePoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * borrowIncentiveCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(borrowIncentiveCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin borrow incentive reward pool data to a more readable format.\n *\n * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data\n * @return Parsed borrow incentive reward pool data\n */\nexport const parseOriginBorrowIncentiveRewardPoolData = (\n originBorrowIncentiveRewardPoolData: OriginBorrowIncentiveRewardPoolData\n): ParsedBorrowIncentiveRewardPoolData => {\n return {\n rewardType: normalizeStructTag(\n originBorrowIncentiveRewardPoolData.reward_type.name\n ),\n claimedRewards: Number(originBorrowIncentiveRewardPoolData.claimed_rewards),\n exchangeRateNumerator: Number(\n originBorrowIncentiveRewardPoolData.exchange_rate_numerator\n ),\n exchangeRateDenominator: Number(\n originBorrowIncentiveRewardPoolData.exchange_rate_denominator\n ),\n rewardsFeeRateNumerator: Number(\n originBorrowIncentiveRewardPoolData.rewards_fee_rate_numerator\n ),\n rewardsFeeRateDenominator: Number(\n originBorrowIncentiveRewardPoolData.rewards_fee_rate_denominator\n ),\n remainingRewards: Number(\n originBorrowIncentiveRewardPoolData.remaining_reward\n ),\n };\n};\n\nexport const calculateBorrowIncentiveRewardPoolData = (\n parsedBorrowIncentivePoolData: ParsedBorrowIncentivePoolData,\n parsedBorrowIncentiveRewardPoolData: ParsedBorrowIncentiveRewardPoolData,\n calculatedBorrowIncentivePoolData: CalculatedBorrowIncentivePoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number\n): CalculatedBorrowIncentiveRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(\n calculatedBorrowIncentivePoolData.distributedPointPerSec\n )\n .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedBorrowIncentivePoolData.maxPoint)\n .multipliedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(\n parsedBorrowIncentiveRewardPoolData.remainingRewards\n );\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(\n parsedBorrowIncentiveRewardPoolData.claimedRewards\n );\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(\n -1 * rewardCoinDecimal\n );\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n const rewardRate = rewardValueForYear\n .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)\n .isFinite()\n ? rewardValueForYear\n .dividedBy(calculatedBorrowIncentivePoolData.stakedValue)\n .toNumber()\n : Infinity;\n const rewardFeeRate = BigNumber(\n parsedBorrowIncentiveRewardPoolData.rewardsFeeRateNumerator\n )\n .dividedBy(parsedBorrowIncentiveRewardPoolData.rewardsFeeRateDenominator)\n .toNumber();\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n rewardFee: rewardFeeRate,\n };\n};\n\n/**\n * Parse origin borrow incentive account data to a more readable format.\n *\n * @param originBorrowIncentiveAccountData - Origin borrow incentive account data\n * @return Parsed borrow incentive account data\n */\nexport const parseOriginBorrowIncentiveAccountData = (\n originBorrowIncentiveAccountData: OriginBorrowIncentiveAccountData\n): ParsedBorrowIncentiveAccountData => {\n return {\n poolType: normalizeStructTag(\n originBorrowIncentiveAccountData.pool_type.name\n ),\n amount: Number(originBorrowIncentiveAccountData.amount),\n index: Number(originBorrowIncentiveAccountData.index),\n points: Number(originBorrowIncentiveAccountData.points),\n totalPoints: Number(originBorrowIncentiveAccountData.total_points),\n };\n};\n\nexport const minBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((min, current) =>\n new BigNumber(current).lt(min) ? current : min\n )\n );\n};\n\nexport const maxBigNumber = (...args: BigNumber.Value[]) => {\n return BigNumber(\n args.reduce((max, current) =>\n new BigNumber(current).gt(max) ? current : max\n )\n );\n};\n\n/**\n * Dynamically adjust the decrease or increase ratio according to the amout\n * @param amount - The amount required to calculate factor.\n * @param scaleStep - The scale step required to determine the factor..\n * @param type - The type of the calculation.\n * @return The estimated factor\n * */\nexport const estimatedFactor = (\n amount: number,\n scaleStep: number,\n type: 'increase' | 'decrease'\n) => {\n const amountOfDigits = Math.max(\n 1,\n Math.floor(Math.log10(Math.abs(amount)) + 1)\n );\n\n const adjustScale =\n Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;\n\n let adjustFactor = Math.pow(10, -adjustScale);\n adjustFactor = type === 'increase' ? 1 - adjustFactor : 1 + adjustFactor;\n\n return adjustFactor;\n};\n","import type { PriceFeed } from '@pythnetwork/pyth-sui-js';\nimport {\n SUPPORT_POOLS,\n SUPPORT_COLLATERALS,\n SUPPORT_SPOOLS_REWARDS,\n} from '../constants';\nimport type { ScallopAddress } from '../models';\nimport type {\n SupportAssetCoins,\n SupportCoins,\n SupportMarketCoins,\n} from '../types';\n\nexport const isMarketCoin = (\n coinName: SupportCoins\n): coinName is SupportMarketCoins => {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return (\n coinName.charAt(0).toLowerCase() === 's' &&\n [\n ...new Set([\n ...SUPPORT_POOLS,\n ...SUPPORT_COLLATERALS,\n ...SUPPORT_SPOOLS_REWARDS,\n ]),\n ].includes(assetCoinName)\n );\n};\n\nexport const parseAssetSymbol = (coinName: SupportAssetCoins): string => {\n switch (coinName) {\n case 'afsui':\n return 'afSUI';\n case 'hasui':\n return 'haSUI';\n case 'vsui':\n return 'vSUI';\n default:\n return coinName.toUpperCase();\n }\n};\n\n/**\n * Parse price from pyth price feed.\n *\n * @param feed - Price feed object from pyth.\n * @param address - Scallop address instance.\n * @return Price Data inclue coin name, price, and publish time.\n */\nexport const parseDataFromPythPriceFeed = (\n feed: PriceFeed,\n address: ScallopAddress\n) => {\n const assetCoinNames = [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ] as SupportAssetCoins[];\n const assetCoinName = assetCoinNames.find((assetCoinName) => {\n return (\n address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`) === feed.id\n );\n });\n if (assetCoinName) {\n const price = feed.price.price * 10 ** feed.price.expo;\n\n return {\n coinName: assetCoinName,\n price,\n publishTime: Number(feed.price.publishTime) * 10 ** 3,\n };\n } else {\n throw new Error('Invalid feed id');\n }\n};\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SUPPORT_SPOOLS } from '../constants';\nimport {\n parseOriginSpoolData,\n calculateSpoolData,\n parseOriginSpoolRewardPoolData,\n calculateSpoolRewardPoolData,\n isMarketCoin,\n} from '../utils';\nimport type { SuiObjectResponse } from '@mysten/sui.js/client';\nimport type { ScallopQuery } from '../models';\nimport type {\n MarketPool,\n Spools,\n Spool,\n StakePool,\n StakeRewardPool,\n StakeAccounts,\n SupportStakeMarketCoins,\n SupportStakeCoins,\n CoinPrices,\n} from '../types';\n\n/**\n * Get spools data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @return Spools data.\n */\nexport const getSpools = async (\n query: ScallopQuery,\n stakeMarketCoinNames?: SupportStakeMarketCoins[],\n indexer: boolean = false\n) => {\n stakeMarketCoinNames = stakeMarketCoinNames || [...SUPPORT_SPOOLS];\n const stakeCoinNames = stakeMarketCoinNames.map((stakeMarketCoinName) =>\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName)\n );\n const rewardCoinNames = stakeMarketCoinNames.map((stakeMarketCoinName) => {\n const rewardCoinName =\n query.utils.getSpoolRewardCoinName(stakeMarketCoinName);\n return rewardCoinName;\n });\n const coinPrices = await query.utils.getCoinPrices(\n [...new Set([...stakeCoinNames, ...rewardCoinNames])] ?? []\n );\n\n const marketPools = await query.getMarketPools(stakeCoinNames, indexer);\n const spools: Spools = {};\n\n if (indexer) {\n const spoolsIndexer = await query.indexer.getSpools();\n for (const spool of Object.values(spoolsIndexer)) {\n if (!stakeMarketCoinNames.includes(spool.marketCoinName)) continue;\n const coinName = query.utils.parseCoinName<SupportStakeCoins>(\n spool.marketCoinName\n );\n const rewardCoinName = query.utils.getSpoolRewardCoinName(\n spool.marketCoinName\n );\n const marketPool = marketPools[coinName];\n spool.coinPrice = coinPrices[coinName] || spool.coinPrice;\n spool.marketCoinPrice =\n (coinPrices[coinName] ?? 0) *\n (marketPool ? marketPool.conversionRate : 0) || spool.marketCoinPrice;\n spool.rewardCoinPrice =\n coinPrices[rewardCoinName] || spool.rewardCoinPrice;\n spools[spool.marketCoinName] = spool;\n }\n\n return spools;\n }\n\n for (const stakeMarketCoinName of stakeMarketCoinNames) {\n const stakeCoinName =\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const spool = await getSpool(\n query,\n stakeMarketCoinName,\n indexer,\n marketPools[stakeCoinName],\n coinPrices\n );\n\n if (spool) {\n spools[stakeMarketCoinName] = spool;\n }\n }\n\n return spools;\n};\n\n/**\n * Get spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @param indexer - Whether to use indexer.\n * @param marketPool - The market pool data.\n * @param coinPrices - The coin prices.\n * @return Spool data.\n */\nexport const getSpool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins,\n indexer: boolean = false,\n marketPool?: MarketPool,\n coinPrices?: CoinPrices\n) => {\n const coinName = query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);\n marketPool = marketPool || (await query.getMarketPool(coinName, indexer));\n const spoolPkgId = query.address.get(`spool.id`);\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n const rewardPoolId = query.address.get(\n `spool.pools.${marketCoinName}.rewardPoolId`\n );\n let spool: Spool | undefined = undefined;\n\n if (indexer) {\n const spoolIndexer = await query.indexer.getSpool(marketCoinName);\n const coinName =\n query.utils.parseCoinName<SupportStakeCoins>(marketCoinName);\n const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);\n spoolIndexer.coinPrice = coinPrices?.[coinName] || spoolIndexer.coinPrice;\n spoolIndexer.marketCoinPrice =\n (coinPrices?.[coinName] ?? 0) *\n (marketPool ? marketPool.conversionRate : 0) ||\n spoolIndexer.marketCoinPrice;\n spoolIndexer.rewardCoinPrice =\n coinPrices?.[rewardCoinName] || spoolIndexer.rewardCoinPrice;\n\n return spoolIndexer;\n }\n\n const spoolObjectResponse = await query.suiKit.client().multiGetObjects({\n ids: [poolId, rewardPoolId],\n options: {\n showContent: true,\n },\n });\n const spoolRewardFeeDynamicFieldsResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: rewardPoolId,\n name: {\n type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,\n value: { dummy_field: false },\n },\n });\n\n if (\n marketPool &&\n spoolObjectResponse[0].data &&\n spoolObjectResponse[1].data\n ) {\n const rewardCoinName = query.utils.getSpoolRewardCoinName(marketCoinName);\n coinPrices =\n coinPrices ||\n (await query.utils.getCoinPrices([coinName, rewardCoinName]));\n\n const spoolObject = spoolObjectResponse[0].data;\n const rewardPoolObject = spoolObjectResponse[1].data;\n const rewardFeeObject = spoolRewardFeeDynamicFieldsResponse.data;\n if (spoolObject.content && 'fields' in spoolObject.content) {\n const spoolFields = spoolObject.content.fields as any;\n const parsedSpoolData = parseOriginSpoolData({\n stakeType: spoolFields.stake_type,\n maxDistributedPoint: spoolFields.max_distributed_point,\n distributedPoint: spoolFields.distributed_point,\n distributedPointPerPeriod: spoolFields.distributed_point_per_period,\n pointDistributionTime: spoolFields.point_distribution_time,\n maxStake: spoolFields.max_stakes,\n stakes: spoolFields.stakes,\n index: spoolFields.index,\n createdAt: spoolFields.created_at,\n lastUpdate: spoolFields.last_update,\n });\n\n const marketCoinPrice =\n (coinPrices?.[coinName] ?? 0) * marketPool.conversionRate;\n const marketCoinDecimal = query.utils.getCoinDecimal(marketCoinName);\n const calculatedSpoolData = calculateSpoolData(\n parsedSpoolData,\n marketCoinPrice,\n marketCoinDecimal\n );\n\n if (\n rewardPoolObject.content &&\n rewardFeeObject?.content &&\n 'fields' in rewardPoolObject.content &&\n 'fields' in rewardFeeObject.content\n ) {\n const rewardPoolFields = rewardPoolObject.content.fields as any;\n const rewardFeeFields = (rewardFeeObject.content.fields as any).value\n .fields;\n const parsedSpoolRewardPoolData = parseOriginSpoolRewardPoolData({\n claimed_rewards: rewardPoolFields.claimed_rewards,\n exchange_rate_numerator: rewardPoolFields.exchange_rate_numerator,\n exchange_rate_denominator: rewardPoolFields.exchange_rate_denominator,\n fee_rate_numerator: rewardFeeFields.fee_rate_numerator,\n fee_rate_denominator: rewardFeeFields.fee_rate_denominator,\n rewards: rewardPoolFields.rewards,\n spool_id: rewardPoolFields.spool_id,\n });\n\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n\n const calculatedRewardPoolData = calculateSpoolRewardPoolData(\n parsedSpoolData,\n parsedSpoolRewardPoolData,\n calculatedSpoolData,\n rewardCoinPrice,\n rewardCoinDecimal\n );\n\n spool = {\n marketCoinName: marketCoinName,\n symbol: query.utils.parseSymbol(marketCoinName),\n coinType: query.utils.parseCoinType(coinName),\n marketCoinType: query.utils.parseMarketCoinType(coinName),\n rewardCoinType: isMarketCoin(rewardCoinName)\n ? query.utils.parseMarketCoinType(rewardCoinName)\n : query.utils.parseCoinType(rewardCoinName),\n coinDecimal: query.utils.getCoinDecimal(coinName),\n rewardCoinDecimal: query.utils.getCoinDecimal(rewardCoinName),\n coinPrice: coinPrices?.[coinName] ?? 0,\n marketCoinPrice: marketCoinPrice,\n rewardCoinPrice: rewardCoinPrice,\n maxPoint: parsedSpoolData.maxPoint,\n distributedPoint: parsedSpoolData.distributedPoint,\n maxStake: parsedSpoolData.maxStake,\n ...calculatedSpoolData,\n exchangeRateNumerator:\n parsedSpoolRewardPoolData.exchangeRateNumerator,\n exchangeRateDenominator:\n parsedSpoolRewardPoolData.exchangeRateDenominator,\n ...calculatedRewardPoolData,\n };\n }\n }\n }\n\n return spool;\n};\n\n/**\n * Get all stake accounts of the owner.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - Owner address.\n * @return Stake accounts.\n */\nexport const getStakeAccounts = async (\n query: ScallopQuery,\n ownerAddress?: string\n) => {\n const owner = ownerAddress || query.suiKit.currentAddress();\n const spoolObjectId = query.address.get('spool.object');\n const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;\n const stakeObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedStakeObjectsResponse = await query.suiKit\n .client()\n .getOwnedObjects({\n owner,\n filter: { StructType: stakeAccountType },\n options: {\n showContent: true,\n showType: true,\n },\n cursor: nextCursor,\n });\n stakeObjectsResponse.push(...paginatedStakeObjectsResponse.data);\n if (\n paginatedStakeObjectsResponse.hasNextPage &&\n paginatedStakeObjectsResponse.nextCursor\n ) {\n hasNextPage = true;\n nextCursor = paginatedStakeObjectsResponse.nextCursor;\n }\n } while (hasNextPage);\n\n const stakeAccounts: StakeAccounts = {\n ssui: [],\n susdc: [],\n susdt: [],\n };\n\n const stakeMarketCoinTypes: Record<SupportStakeMarketCoins, string> =\n Object.keys(stakeAccounts).reduce(\n (types, stakeMarketCoinName) => {\n const stakeCoinName =\n query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const marketCoinType = query.utils.parseMarketCoinType(stakeCoinName);\n\n types[\n stakeMarketCoinName as SupportStakeMarketCoins\n ] = `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;\n return types;\n },\n {} as Record<SupportStakeMarketCoins, string>\n );\n\n const stakeObjectIds: string[] = stakeObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const stakeObjects = await query.suiKit.getObjects(stakeObjectIds);\n for (const stakeObject of stakeObjects) {\n const id = stakeObject.objectId;\n const type = stakeObject.type!;\n if (stakeObject.content && 'fields' in stakeObject.content) {\n const fields = stakeObject.content.fields as any;\n const stakePoolId = String(fields.spool_id);\n const stakeType = String(fields.stake_type.fields.name);\n const staked = Number(fields.stakes);\n const index = Number(fields.index);\n const points = Number(fields.points);\n const totalPoints = Number(fields.total_points);\n if (normalizeStructTag(type) === stakeMarketCoinTypes.ssui) {\n stakeAccounts.ssui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdc) {\n stakeAccounts.susdc.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdt) {\n stakeAccounts.susdt.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n }\n }\n }\n return stakeAccounts;\n};\n\n/**\n * Get stake pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get stake pool info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\nexport const getStakePool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins\n) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n let stakePool: StakePool | undefined = undefined;\n const stakePoolObjectResponse = await query.suiKit.client().getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakePoolObjectResponse.data) {\n const stakePoolObject = stakePoolObjectResponse.data;\n const id = stakePoolObject.objectId;\n const type = stakePoolObject.type!;\n if (stakePoolObject.content && 'fields' in stakePoolObject.content) {\n const fields = stakePoolObject.content.fields as any;\n const maxPoint = Number(fields.max_distributed_point);\n const distributedPoint = Number(fields.distributed_point);\n const pointPerPeriod = Number(fields.distributed_point_per_period);\n const period = Number(fields.point_distribution_time);\n const maxStake = Number(fields.max_stakes);\n const stakeType = String(fields.stake_type.fields.name);\n const totalStaked = Number(fields.stakes);\n const index = Number(fields.index);\n const createdAt = Number(fields.created_at);\n const lastUpdate = Number(fields.last_update);\n stakePool = {\n id,\n type: normalizeStructTag(type),\n maxPoint,\n distributedPoint,\n pointPerPeriod,\n period,\n maxStake,\n stakeType: normalizeStructTag(stakeType),\n totalStaked,\n index,\n createdAt,\n lastUpdate,\n };\n }\n }\n return stakePool;\n};\n\n/**\n * Get stake reward pool of the owner.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get reward info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool.\n */\nexport const getStakeRewardPool = async (\n query: ScallopQuery,\n marketCoinName: SupportStakeMarketCoins\n) => {\n const spoolPkgId = query.address.get('spool.id');\n const poolId = query.address.get(\n `spool.pools.${marketCoinName}.rewardPoolId`\n );\n let stakeRewardPool: StakeRewardPool | undefined = undefined;\n const stakeRewardPoolObjectResponse = await query.suiKit.client().getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n const stakeRewardFeeDynamicFieldsResponse = await query.suiKit\n .client()\n .getDynamicFieldObject({\n parentId: poolId,\n name: {\n type: `${spoolPkgId}::rewards_pool::RewardsPoolFeeKey`,\n value: { dummy_field: false },\n },\n });\n if (\n stakeRewardPoolObjectResponse.data &&\n stakeRewardFeeDynamicFieldsResponse.data\n ) {\n const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;\n const stakeRewardFeeDynamicFieldObject =\n stakeRewardFeeDynamicFieldsResponse.data;\n const id = stakeRewardPoolObject.objectId;\n const type = stakeRewardPoolObject.type!;\n if (\n stakeRewardPoolObject.content &&\n stakeRewardFeeDynamicFieldObject.content &&\n 'fields' in stakeRewardPoolObject.content &&\n 'fields' in stakeRewardFeeDynamicFieldObject.content\n ) {\n const rewardPoolFields = stakeRewardPoolObject.content.fields as any;\n const rewardFeeFields = (\n stakeRewardFeeDynamicFieldObject.content.fields as any\n ).value.fields;\n const stakePoolId = String(rewardPoolFields.spool_id);\n const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);\n const ratioDenominator = Number(\n rewardPoolFields.exchange_rate_denominator\n );\n const rewards = Number(rewardPoolFields.rewards);\n const claimedRewards = Number(rewardPoolFields.claimed_rewards);\n const feeRateNumerator = Number(rewardFeeFields.fee_rate_numerator);\n const feeRateDenominator = Number(rewardFeeFields.fee_rate_denominator);\n\n stakeRewardPool = {\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n ratioNumerator,\n ratioDenominator,\n feeRateNumerator,\n feeRateDenominator,\n rewards,\n claimedRewards,\n };\n }\n }\n return stakeRewardPool;\n};\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport {\n parseOriginBorrowIncentivePoolData,\n calculateBorrowIncentivePoolData,\n parseOriginBorrowIncentiveRewardPoolData,\n calculateBorrowIncentiveRewardPoolData,\n parseOriginBorrowIncentiveAccountData,\n} from '../utils';\nimport type { ScallopQuery } from '../models';\nimport type {\n BorrowIncentivePoolsQueryInterface,\n BorrowIncentivePools,\n BorrowIncentiveAccountsQueryInterface,\n BorrowIncentiveAccounts,\n SupportBorrowIncentiveCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * Query borrow incentive pools data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\nexport const queryBorrowIncentivePools = async (\n query: ScallopQuery,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[],\n indexer: boolean = false\n) => {\n borrowIncentiveCoinNames = borrowIncentiveCoinNames || [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentivePoolsId = query.address.get('borrowIncentive.incentivePools');\n const txBlock = new SuiKitTxBlock();\n const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data`;\n // The reward coin type currently only support sui, so bring it in directly here.\n txBlock.moveCall(queryTarget, [incentivePoolsId], ['0x2::sui::SUI']);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const borrowIncentivePoolsQueryData = queryResult.events[0]\n .parsedJson as BorrowIncentivePoolsQueryInterface;\n\n const parsedBorrowIncentiveRewardPoolData =\n parseOriginBorrowIncentiveRewardPoolData(\n borrowIncentivePoolsQueryData.reward_pool\n );\n const rewardCoinType = parsedBorrowIncentiveRewardPoolData.rewardType;\n const rewardCoinName =\n query.utils.parseCoinNameFromType<SupportAssetCoins>(rewardCoinType);\n const coinPrices = await query.utils.getCoinPrices(\n [...new Set([...borrowIncentiveCoinNames, rewardCoinName])] ?? []\n );\n\n const borrowIncentivePools: BorrowIncentivePools = {};\n\n if (indexer) {\n const borrowIncentivePoolsIndexer =\n await query.indexer.getBorrowIncentivePools();\n for (const borrowIncentivePool of Object.values(\n borrowIncentivePoolsIndexer\n )) {\n if (!borrowIncentiveCoinNames.includes(borrowIncentivePool.coinName))\n continue;\n borrowIncentivePool.coinPrice =\n coinPrices[borrowIncentivePool.coinName] ||\n borrowIncentivePool.coinPrice;\n borrowIncentivePool.rewardCoinPrice =\n coinPrices[rewardCoinName] || borrowIncentivePool.rewardCoinPrice;\n borrowIncentivePools[borrowIncentivePool.coinName] = borrowIncentivePool;\n }\n return borrowIncentivePools;\n }\n\n for (const pool of borrowIncentivePoolsQueryData.incentive_pools) {\n const coinType = normalizeStructTag(pool.pool_type.name);\n const coinName =\n query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(coinType);\n const rewardCoinName =\n query.utils.parseCoinNameFromType<SupportAssetCoins>(rewardCoinType);\n\n // Filter pools not yet supported by the SDK.\n if (!borrowIncentiveCoinNames.includes(coinName)) {\n continue;\n }\n\n const parsedBorrowIncentivePoolData =\n parseOriginBorrowIncentivePoolData(pool);\n\n const coinPrice = coinPrices?.[coinName] ?? 0;\n const coinDecimal = query.utils.getCoinDecimal(coinName);\n const calculatedBorrowIncentivePoolData = calculateBorrowIncentivePoolData(\n parsedBorrowIncentivePoolData,\n coinPrice,\n coinDecimal\n );\n\n const rewardCoinPrice = coinPrices?.[rewardCoinName] ?? 0;\n const rewardCoinDecimal = query.utils.getCoinDecimal(rewardCoinName);\n const calculatedBorrowIncentiveRewardPoolData =\n calculateBorrowIncentiveRewardPoolData(\n parsedBorrowIncentivePoolData,\n parsedBorrowIncentiveRewardPoolData,\n calculatedBorrowIncentivePoolData,\n rewardCoinPrice,\n rewardCoinDecimal\n );\n\n borrowIncentivePools[coinName] = {\n coinName: coinName,\n symbol: query.utils.parseSymbol(coinName),\n coinType: coinType,\n rewardCoinType: rewardCoinType,\n coinDecimal: coinDecimal,\n rewardCoinDecimal: rewardCoinDecimal,\n coinPrice: coinPrice,\n rewardCoinPrice: rewardCoinPrice,\n maxPoint: parsedBorrowIncentivePoolData.maxPoint,\n distributedPoint: parsedBorrowIncentivePoolData.distributedPoint,\n maxStake: parsedBorrowIncentivePoolData.maxStake,\n ...calculatedBorrowIncentivePoolData,\n exchangeRateNumerator:\n parsedBorrowIncentiveRewardPoolData.exchangeRateNumerator,\n exchangeRateDenominator:\n parsedBorrowIncentiveRewardPoolData.exchangeRateDenominator,\n ...calculatedBorrowIncentiveRewardPoolData,\n };\n }\n\n return borrowIncentivePools;\n};\n\n/**\n * Query borrow incentive accounts data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive accounts data.\n */\nexport const queryBorrowIncentiveAccounts = async (\n query: ScallopQuery,\n obligationId: string,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[]\n) => {\n borrowIncentiveCoinNames = borrowIncentiveCoinNames || [\n ...SUPPORT_BORROW_INCENTIVE_POOLS,\n ];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentiveAccountsId = query.address.get(\n 'borrowIncentive.incentiveAccounts'\n );\n const queryTarget = `${queryPkgId}::incentive_account_query::incentive_account_data`;\n const txBlock = new SuiKitTxBlock();\n txBlock.moveCall(queryTarget, [incentiveAccountsId, obligationId]);\n const queryResult = await query.suiKit.inspectTxn(txBlock);\n const borrowIncentiveAccountsQueryData = queryResult.events[0]\n .parsedJson as BorrowIncentiveAccountsQueryInterface;\n\n const borrowIncentiveAccounts: BorrowIncentiveAccounts = Object.values(\n borrowIncentiveAccountsQueryData.incentive_states\n ).reduce((accounts, accountData) => {\n const parsedBorrowIncentiveAccount =\n parseOriginBorrowIncentiveAccountData(accountData);\n const poolType = parsedBorrowIncentiveAccount.poolType;\n const coinName =\n query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolType);\n\n if (\n borrowIncentiveCoinNames &&\n borrowIncentiveCoinNames.includes(coinName)\n ) {\n accounts[coinName] = {\n poolType: poolType,\n amount: parsedBorrowIncentiveAccount.amount,\n points: parsedBorrowIncentiveAccount.points,\n totalPoints: parsedBorrowIncentiveAccount.totalPoints,\n index: parsedBorrowIncentiveAccount.index,\n };\n }\n\n return accounts;\n }, {} as BorrowIncentiveAccounts);\n\n return borrowIncentiveAccounts;\n};\n","import type { ScallopQuery } from '../models';\nimport type { SupportAssetCoins } from '../types';\n\n/**\n * Get price from pyth fee object.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\nexport const getPythPrice = async (\n query: ScallopQuery,\n assetCoinName: SupportAssetCoins\n) => {\n const pythFeedObjectId = query.address.get(\n `core.coins.${assetCoinName}.oracle.pyth.feedObject`\n );\n const priceFeedObjectResponse = await query.suiKit.client().getObject({\n id: pythFeedObjectId,\n options: {\n showContent: true,\n },\n });\n\n if (priceFeedObjectResponse.data) {\n const priceFeedPoolObject = priceFeedObjectResponse.data;\n if (\n priceFeedPoolObject.content &&\n 'fields' in priceFeedPoolObject.content\n ) {\n const fields = priceFeedPoolObject.content.fields as any;\n const expoMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .magnitude\n );\n const expoNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.expo.fields\n .negative\n );\n const priceMagnitude = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .magnitude\n );\n const priceNegative = Number(\n fields.price_info.fields.price_feed.fields.price.fields.price.fields\n .negative\n );\n\n return (\n priceMagnitude *\n 10 ** ((expoNegative ? -1 : 1) * expoMagnitude) *\n (priceNegative ? -1 : 1)\n );\n }\n }\n\n return 0;\n};\n","import BigNumber from 'bignumber.js';\nimport { SUPPORT_POOLS, SUPPORT_SPOOLS } from '../constants';\nimport { minBigNumber, estimatedFactor } from 'src/utils';\nimport type { ScallopQuery } from '../models';\nimport type {\n Market,\n SupportAssetCoins,\n SupportPoolCoins,\n MarketPool,\n Spool,\n StakeAccount,\n Lendings,\n Lending,\n ObligationAccounts,\n ObligationAccount,\n SupportStakeMarketCoins,\n SupportCollateralCoins,\n CoinAmounts,\n CoinPrices,\n SupportMarketCoins,\n TotalValueLocked,\n SupportBorrowIncentiveCoins,\n} from '../types';\n\n/**\n * Get user lending infomation for specific pools.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinNames - Specific an array of support pool coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return User lending infomation for specific pools.\n */\nexport const getLendings = async (\n query: ScallopQuery,\n poolCoinNames?: SupportPoolCoins[],\n ownerAddress?: string,\n indexer: boolean = false\n) => {\n poolCoinNames = poolCoinNames || [...SUPPORT_POOLS];\n const marketCoinNames = poolCoinNames.map((poolCoinName) =>\n query.utils.parseMarketCoinName(poolCoinName)\n );\n const stakeMarketCoinNames = marketCoinNames.filter((marketCoinName) =>\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ) as SupportStakeMarketCoins[];\n\n const marketPools = await query.getMarketPools(poolCoinNames, indexer);\n const spools = await query.getSpools(stakeMarketCoinNames, indexer);\n const coinAmounts = await query.getCoinAmounts(poolCoinNames, ownerAddress);\n const marketCoinAmounts = await query.getMarketCoinAmounts(\n marketCoinNames,\n ownerAddress\n );\n const allStakeAccounts = await query.getAllStakeAccounts(ownerAddress);\n const coinPrices = await query.utils.getCoinPrices(poolCoinNames);\n\n const lendings: Lendings = {};\n for (const poolCoinName of poolCoinNames) {\n const stakeMarketCoinName = stakeMarketCoinNames.find(\n (marketCoinName) =>\n marketCoinName === query.utils.parseMarketCoinName(poolCoinName)\n );\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n lendings[poolCoinName] = await getLending(\n query,\n poolCoinName,\n ownerAddress,\n indexer,\n marketPools?.[poolCoinName],\n stakeMarketCoinName ? spools[stakeMarketCoinName] : undefined,\n stakeMarketCoinName ? allStakeAccounts[stakeMarketCoinName] : undefined,\n coinAmounts?.[poolCoinName],\n marketCoinAmounts?.[marketCoinName],\n coinPrices?.[poolCoinName] ?? 0\n );\n }\n\n return lendings;\n};\n\n/**\n * Get user lending infomation for specific pool.\n *\n * @description\n * The lending information includes the spool information extended by it.\n *\n * @param query - The ScallopQuery instance.\n * @param poolCoinName - Specific support coin name.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @param marketPool - The market pool data.\n * @param spool - The spool data.\n * @param stakeAccounts - The stake accounts data.\n * @param coinAmount - The coin amount.\n * @param marketCoinAmount - The market coin amount.\n * @return User lending infomation for specific pool.\n */\nexport const getLending = async (\n query: ScallopQuery,\n poolCoinName: SupportPoolCoins,\n ownerAddress?: string,\n indexer: boolean = false,\n marketPool?: MarketPool,\n spool?: Spool,\n stakeAccounts?: StakeAccount[],\n coinAmount?: number,\n marketCoinAmount?: number,\n coinPrice?: number\n) => {\n const marketCoinName = query.utils.parseMarketCoinName(poolCoinName);\n marketPool = marketPool || (await query.getMarketPool(poolCoinName, indexer));\n spool =\n spool ||\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ? await query.getSpool(marketCoinName as SupportStakeMarketCoins, indexer)\n : undefined;\n stakeAccounts =\n stakeAccounts ||\n (SUPPORT_SPOOLS as readonly SupportMarketCoins[]).includes(marketCoinName)\n ? await query.getStakeAccounts(\n marketCoinName as SupportStakeMarketCoins,\n ownerAddress\n )\n : [];\n coinAmount =\n coinAmount || (await query.getCoinAmount(poolCoinName, ownerAddress));\n marketCoinAmount =\n marketCoinAmount ||\n (await query.getMarketCoinAmount(marketCoinName, ownerAddress));\n coinPrice =\n coinPrice ||\n (await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];\n const coinDecimal = query.utils.getCoinDecimal(poolCoinName);\n\n // Handle staked scoin\n let stakedMarketAmount = BigNumber(0);\n let stakedMarketCoin = BigNumber(0);\n let stakedAmount = BigNumber(0);\n let stakedCoin = BigNumber(0);\n let stakedValue = BigNumber(0);\n let availableUnstakeAmount = BigNumber(0);\n let availableUnstakeCoin = BigNumber(0);\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n\n if (spool) {\n for (const stakeAccount of stakeAccounts) {\n const accountStakedMarketCoinAmount = BigNumber(stakeAccount.staked);\n const accountStakedMarketCoin = accountStakedMarketCoinAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedAmount = accountStakedMarketCoinAmount.multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const accountStakedCoin = accountStakedAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n const accountStakedValue = accountStakedCoin.multipliedBy(\n spool.coinPrice\n );\n\n stakedMarketAmount = stakedMarketAmount.plus(\n accountStakedMarketCoinAmount\n );\n stakedMarketCoin = stakedMarketCoin.plus(accountStakedMarketCoin);\n stakedAmount = stakedAmount.plus(accountStakedAmount);\n stakedCoin = stakedCoin.plus(accountStakedCoin);\n stakedValue = stakedValue.plus(accountStakedValue);\n availableUnstakeAmount = availableUnstakeAmount.plus(\n accountStakedMarketCoinAmount\n );\n availableUnstakeCoin = availableUnstakeAmount.shiftedBy(\n -1 * spool.coinDecimal\n );\n\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = spool.currentPointIndex\n ? BigNumber(spool.currentPointIndex - stakeAccount.index).dividedBy(\n baseIndexRate\n )\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountStakedMarketCoinAmount\n .multipliedBy(increasedPointRate)\n .plus(stakeAccount.points)\n .multipliedBy(spool.exchangeRateNumerator)\n .dividedBy(spool.exchangeRateDenominator)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * spool.rewardCoinDecimal\n );\n }\n }\n\n // Handle supplied coin\n const suppliedAmount = BigNumber(marketCoinAmount).multipliedBy(\n marketPool?.conversionRate ?? 1\n );\n const suppliedCoin = suppliedAmount.shiftedBy(-1 * coinDecimal);\n const suppliedValue = suppliedCoin.multipliedBy(coinPrice ?? 0);\n\n const unstakedMarketAmount = BigNumber(marketCoinAmount);\n const unstakedMarketCoin = unstakedMarketAmount.shiftedBy(-1 * coinDecimal);\n\n const availableSupplyAmount = BigNumber(coinAmount);\n const availableSupplyCoin = availableSupplyAmount.shiftedBy(-1 * coinDecimal);\n const availableWithdrawAmount = minBigNumber(\n suppliedAmount,\n marketPool?.supplyAmount ?? Infinity\n ).plus(stakedAmount);\n const availableWithdrawCoin = minBigNumber(\n suppliedCoin,\n marketPool?.supplyCoin ?? Infinity\n ).plus(stakedCoin);\n\n const lending: Lending = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: query.utils.parseCoinType(poolCoinName),\n marketCoinType: query.utils.parseMarketCoinType(poolCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice ?? 0,\n supplyApr: marketPool?.supplyApr ?? 0,\n supplyApy: marketPool?.supplyApy ?? 0,\n rewardApr: spool?.rewardApr ?? 0,\n suppliedAmount: suppliedAmount.plus(stakedAmount).toNumber(),\n suppliedCoin: suppliedCoin.plus(stakedCoin).toNumber(),\n suppliedValue: suppliedValue.plus(stakedValue).toNumber(),\n stakedMarketAmount: stakedMarketAmount.toNumber(),\n stakedMarketCoin: stakedMarketCoin.toNumber(),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n unstakedMarketAmount: unstakedMarketAmount.toNumber(),\n unstakedMarketCoin: unstakedMarketCoin.toNumber(),\n unstakedAmount: suppliedAmount.toNumber(),\n unstakedCoin: suppliedCoin.toNumber(),\n unstakedValue: suppliedValue.toNumber(),\n availableSupplyAmount: availableSupplyAmount.toNumber(),\n availableSupplyCoin: availableSupplyCoin.toNumber(),\n availableWithdrawAmount: availableWithdrawAmount.toNumber(),\n availableWithdrawCoin: availableWithdrawCoin.toNumber(),\n availableStakeAmount: unstakedMarketAmount.toNumber(),\n availableStakeCoin: unstakedMarketCoin.toNumber(),\n availableUnstakeAmount: availableUnstakeAmount.toNumber(),\n availableUnstakeCoin: availableUnstakeCoin.toNumber(),\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n };\n\n return lending;\n};\n\n/**\n * Get all obligation accounts data.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @param indexer - Whether to use indexer.\n * @return All obligation accounts data.\n */\nexport const getObligationAccounts = async (\n query: ScallopQuery,\n ownerAddress?: string,\n indexer: boolean = false\n) => {\n const market = await query.queryMarket(indexer);\n const coinPrices = await query.utils.getCoinPrices();\n const coinAmounts = await query.getCoinAmounts(undefined, ownerAddress);\n const obligations = await query.getObligations(ownerAddress);\n\n const obligationAccounts: ObligationAccounts = {};\n for (const obligation of obligations) {\n obligationAccounts[obligation.keyId] = await getObligationAccount(\n query,\n obligation.id,\n ownerAddress,\n indexer,\n market,\n coinPrices,\n coinAmounts\n );\n }\n\n return obligationAccounts;\n};\n\n/**\n * Get obligation account data.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @param indexer - Whether to use indexer.\n * @return Obligation account data.\n */\nexport const getObligationAccount = async (\n query: ScallopQuery,\n obligationId: string,\n ownerAddress?: string,\n indexer: boolean = false,\n market?: Market,\n coinPrices?: CoinPrices,\n coinAmounts?: CoinAmounts\n) => {\n market = market || (await query.queryMarket(indexer));\n const assetCoinNames: SupportAssetCoins[] = [\n ...new Set([\n ...Object.values(market.pools).map((pool) => pool.coinName),\n ...Object.values(market.collaterals).map(\n (collateral) => collateral.coinName\n ),\n ]),\n ];\n const obligationQuery = await query.queryObligation(obligationId);\n const borrowIncentivePools = await query.getBorrowIncentivePools(\n undefined,\n indexer\n );\n const borrowIncentiveAccounts =\n await query.getBorrowIncentiveAccounts(obligationId);\n coinPrices = coinPrices || (await query.utils.getCoinPrices(assetCoinNames));\n coinAmounts =\n coinAmounts || (await query.getCoinAmounts(assetCoinNames, ownerAddress));\n\n const collaterals: ObligationAccount['collaterals'] = {};\n const debts: ObligationAccount['debts'] = {};\n const borrowIncentives: ObligationAccount['borrowIncentives'] = {};\n let totalDepositedPools = 0;\n let totalDepositedValue = BigNumber(0);\n let totalBorrowCapacityValue = BigNumber(0);\n let totalRequiredCollateralValue = BigNumber(0);\n let totalBorrowedPools = 0;\n let totalBorrowedValue = BigNumber(0);\n let totalBorrowedValueWithWeight = BigNumber(0);\n\n for (const assetCoinName of assetCoinNames) {\n const collateral = obligationQuery.collaterals.find((collateral) => {\n const collateralCoinName =\n query.utils.parseCoinNameFromType<SupportCollateralCoins>(\n collateral.type.name\n );\n return assetCoinName === collateralCoinName;\n });\n\n const marketCollateral = market.collaterals[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketCollateral && coinPrice) {\n const depositedAmount = BigNumber(collateral?.amount ?? 0);\n const depositedCoin = depositedAmount.shiftedBy(-1 * coinDecimal);\n const depositedValue = depositedCoin.multipliedBy(coinPrice);\n const borrowCapacityValue = depositedValue.multipliedBy(\n marketCollateral.collateralFactor\n );\n const requiredCollateralValue = depositedValue.multipliedBy(\n marketCollateral.liquidationFactor\n );\n\n const poolSizeAmount = BigNumber(marketCollateral.maxDepositAmount).minus(\n marketCollateral.depositAmount\n );\n const availableDepositAmount = minBigNumber(\n BigNumber(coinAmount),\n poolSizeAmount\n );\n const availableDepositCoin = availableDepositAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n totalDepositedValue = totalDepositedValue.plus(depositedValue);\n totalBorrowCapacityValue =\n totalBorrowCapacityValue.plus(borrowCapacityValue);\n totalRequiredCollateralValue = totalRequiredCollateralValue.plus(\n requiredCollateralValue\n );\n\n if (depositedAmount.isGreaterThan(0)) {\n totalDepositedPools++;\n }\n\n collaterals[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n depositedAmount: depositedAmount.toNumber(),\n depositedCoin: depositedCoin.toNumber(),\n depositedValue: depositedValue.toNumber(),\n borrowCapacityValue: borrowCapacityValue.toNumber(),\n requiredCollateralValue: requiredCollateralValue.toNumber(),\n availableDepositAmount: availableDepositAmount.toNumber(),\n availableDepositCoin: availableDepositCoin.toNumber(),\n availableWithdrawAmount: 0,\n availableWithdrawCoin: 0,\n };\n }\n }\n\n for (const assetCoinName of assetCoinNames) {\n const debt = obligationQuery.debts.find((debt) => {\n const poolCoinName = query.utils.parseCoinNameFromType<SupportPoolCoins>(\n debt.type.name\n );\n return assetCoinName === poolCoinName;\n });\n\n const marketPool = market.pools[assetCoinName];\n const coinDecimal = query.utils.getCoinDecimal(assetCoinName);\n const coinPrice = coinPrices?.[assetCoinName];\n const coinAmount = coinAmounts?.[assetCoinName] ?? 0;\n\n if (marketPool && coinPrice) {\n const increasedRate = debt?.borrowIndex\n ? marketPool.borrowIndex / Number(debt.borrowIndex) - 1\n : 0;\n const borrowedAmount = BigNumber(debt?.amount ?? 0);\n const borrowedCoin = borrowedAmount.shiftedBy(-1 * coinDecimal);\n\n const requiredRepayAmount = borrowedAmount.multipliedBy(\n increasedRate + 1\n );\n const requiredRepayCoin = requiredRepayAmount.shiftedBy(-1 * coinDecimal);\n\n const availableRepayAmount = BigNumber(coinAmount);\n const availableRepayCoin = availableRepayAmount.shiftedBy(\n -1 * coinDecimal\n );\n\n const borrowedValue = requiredRepayCoin.multipliedBy(coinPrice);\n const borrowedValueWithWeight = borrowedValue.multipliedBy(\n marketPool.borrowWeight\n );\n\n totalBorrowedValue = totalBorrowedValue.plus(borrowedValue);\n totalBorrowedValueWithWeight = totalBorrowedValueWithWeight.plus(\n borrowedValueWithWeight\n );\n\n if (borrowedAmount.isGreaterThan(0)) {\n totalBorrowedPools++;\n }\n\n debts[assetCoinName] = {\n coinName: assetCoinName,\n coinType: query.utils.parseCoinType(assetCoinName),\n symbol: query.utils.parseSymbol(assetCoinName),\n coinDecimal: coinDecimal,\n coinPrice: coinPrice,\n borrowedAmount: borrowedAmount.toNumber(),\n borrowedCoin: borrowedCoin.toNumber(),\n borrowedValue: borrowedValue.toNumber(),\n borrowedValueWithWeight: borrowedValueWithWeight.toNumber(),\n borrowIndex: Number(debt?.borrowIndex ?? 0),\n requiredRepayAmount: requiredRepayAmount.toNumber(),\n requiredRepayCoin: requiredRepayCoin.toNumber(),\n availableBorrowAmount: 0,\n availableBorrowCoin: 0,\n availableRepayAmount: availableRepayAmount.toNumber(),\n availableRepayCoin: availableRepayCoin.toNumber(),\n };\n }\n }\n\n for (const [poolCoinName, borrowIncentiveAccount] of Object.entries(\n borrowIncentiveAccounts\n )) {\n const coinName = poolCoinName as SupportBorrowIncentiveCoins;\n const borrowIncentivePool = borrowIncentivePools[coinName];\n\n let availableClaimAmount = BigNumber(0);\n let availableClaimCoin = BigNumber(0);\n if (borrowIncentivePool) {\n const accountBorrowedAmount = BigNumber(borrowIncentiveAccount.amount);\n const baseIndexRate = 1_000_000_000;\n const increasedPointRate = borrowIncentivePool.currentPointIndex\n ? BigNumber(\n borrowIncentivePool.currentPointIndex - borrowIncentiveAccount.index\n ).dividedBy(baseIndexRate)\n : 1;\n availableClaimAmount = availableClaimAmount.plus(\n accountBorrowedAmount\n .multipliedBy(increasedPointRate)\n .plus(borrowIncentiveAccount.points)\n .multipliedBy(borrowIncentivePool.exchangeRateNumerator)\n .dividedBy(borrowIncentivePool.exchangeRateDenominator)\n );\n availableClaimCoin = availableClaimAmount.shiftedBy(\n -1 * borrowIncentivePool.rewardCoinDecimal\n );\n\n if (availableClaimAmount.isGreaterThan(0)) {\n borrowIncentives[coinName] = {\n coinName: borrowIncentivePool.coinName,\n coinType: borrowIncentivePool.coinType,\n rewardCoinType: borrowIncentivePool.rewardCoinType,\n symbol: borrowIncentivePool.symbol,\n coinDecimal: borrowIncentivePool.coinDecimal,\n rewardCoinDecimal: borrowIncentivePool.rewardCoinDecimal,\n coinPrice: borrowIncentivePool.coinPrice,\n rewardCoinPrice: borrowIncentivePool.rewardCoinPrice,\n availableClaimAmount: availableClaimAmount.toNumber(),\n availableClaimCoin: availableClaimCoin.toNumber(),\n };\n }\n }\n }\n\n let riskLevel = totalRequiredCollateralValue.isZero()\n ? BigNumber(0)\n : totalBorrowedValueWithWeight.dividedBy(totalRequiredCollateralValue);\n // Note: 100% represents the safety upper limit. Even if it exceeds 100% before it is liquidated, it will only display 100%.\n riskLevel = riskLevel.isLessThan(1) ? riskLevel : BigNumber(1);\n\n const accountBalanceValue = totalDepositedValue\n .minus(totalBorrowedValue)\n .isGreaterThan(0)\n ? totalDepositedValue.minus(totalBorrowedValue)\n : BigNumber(0);\n const availableCollateralValue = totalBorrowCapacityValue\n .minus(totalBorrowedValueWithWeight)\n .isGreaterThan(0)\n ? totalBorrowCapacityValue.minus(totalBorrowedValueWithWeight)\n : BigNumber(0);\n const requiredCollateralValue = totalBorrowedValueWithWeight.isGreaterThan(0)\n ? totalRequiredCollateralValue\n : BigNumber(0);\n const unhealthyCollateralValue = totalBorrowedValueWithWeight\n .minus(requiredCollateralValue)\n .isGreaterThan(0)\n ? totalBorrowedValueWithWeight.minus(requiredCollateralValue)\n : BigNumber(0);\n\n const obligationAccount: ObligationAccount = {\n obligationId: obligationId,\n // Deposited collateral value (collateral balance)\n totalDepositedValue: totalDepositedValue.toNumber(),\n // Borrowed debt value (liabilities balance)\n totalBorrowedValue: totalBorrowedValue.toNumber(),\n // The difference between the user’s actual deposit and loan (remaining balance)\n totalBalanceValue: accountBalanceValue.toNumber(),\n // Effective collateral value (the actual collateral value included in the calculation).\n totalBorrowCapacityValue: totalBorrowCapacityValue.toNumber(),\n // Available collateral value (the remaining collateral value that can be borrowed).\n totalAvailableCollateralValue: availableCollateralValue.toNumber(),\n // Available debt value (the actual borrowing value included in the calculation).\n totalBorrowedValueWithWeight: totalBorrowedValueWithWeight.toNumber(),\n // Required collateral value (avoid be liquidated).\n totalRequiredCollateralValue: requiredCollateralValue.toNumber(),\n // Unliquidated collateral value (pending liquidation).\n totalUnhealthyCollateralValue: unhealthyCollateralValue.toNumber(),\n totalRiskLevel: riskLevel.toNumber(),\n totalDepositedPools,\n totalBorrowedPools,\n collaterals,\n debts,\n borrowIncentives,\n };\n\n for (const [collateralCoinName, obligationCollateral] of Object.entries(\n obligationAccount.collaterals\n )) {\n const marketCollateral =\n market.collaterals[collateralCoinName as SupportCollateralCoins];\n if (marketCollateral) {\n let estimatedAvailableWithdrawAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketCollateral.collateralFactor)\n .dividedBy(marketCollateral.coinPrice)\n .shiftedBy(marketCollateral.coinDecimal);\n estimatedAvailableWithdrawAmount =\n obligationAccount.totalBorrowedValueWithWeight === 0\n ? // Note: when there is no debt record, there is no need to estimate and the deposited amount is directly used as available withdraw.\n BigNumber(obligationCollateral.depositedAmount)\n : minBigNumber(\n estimatedAvailableWithdrawAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n BigNumber(obligationAccount.totalAvailableCollateralValue)\n .dividedBy(marketCollateral.collateralFactor)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n obligationCollateral.depositedAmount,\n marketCollateral.depositAmount\n );\n obligationCollateral.availableWithdrawAmount =\n estimatedAvailableWithdrawAmount.toNumber();\n obligationCollateral.availableWithdrawCoin =\n estimatedAvailableWithdrawAmount\n .shiftedBy(-1 * obligationCollateral.coinDecimal)\n .toNumber();\n }\n }\n for (const [poolCoinName, obligationDebt] of Object.entries(\n obligationAccount.debts\n )) {\n const marketPool = market.pools[poolCoinName as SupportPoolCoins];\n if (marketPool) {\n const estimatedRequiredRepayAmount = BigNumber(\n obligationDebt.requiredRepayAmount\n )\n // Note: reduced chance of not being able to repay in full when calculations are inaccurate,\n // and the contract will not actually take the excess amount.\n .multipliedBy(\n estimatedFactor(obligationDebt.borrowedValue, 3, 'decrease')\n );\n\n let estimatedAvailableBorrowAmount = BigNumber(\n obligationAccount.totalAvailableCollateralValue\n )\n .dividedBy(marketPool.borrowWeight)\n .shiftedBy(marketPool.coinDecimal)\n .dividedBy(marketPool.coinPrice);\n estimatedAvailableBorrowAmount =\n obligationAccount.totalAvailableCollateralValue !== 0\n ? minBigNumber(\n estimatedAvailableBorrowAmount\n // Note: reduced chance of failure when calculations are inaccurate\n .multipliedBy(\n estimatedFactor(\n estimatedAvailableBorrowAmount\n .shiftedBy(-1 * marketPool.coinDecimal)\n .multipliedBy(marketPool.coinPrice)\n .toNumber(),\n 3,\n 'increase'\n )\n )\n .toNumber(),\n marketPool.supplyAmount\n )\n : BigNumber(0);\n\n obligationDebt.availableBorrowAmount =\n estimatedAvailableBorrowAmount.toNumber();\n obligationDebt.availableBorrowCoin = estimatedAvailableBorrowAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n obligationDebt.requiredRepayAmount =\n estimatedRequiredRepayAmount.toNumber();\n obligationDebt.requiredRepayCoin = estimatedRequiredRepayAmount\n .shiftedBy(-1 * obligationDebt.coinDecimal)\n .toNumber();\n }\n }\n\n return obligationAccount;\n};\n\n/**\n * Get total value locked data.\n *\n * @param query - The Scallop query instance.\n * @param indexer - Whether to use indexer.\n * @return Total value locked data.\n */\nexport const getTotalValueLocked = async (\n query: ScallopQuery,\n indexer: boolean = false\n) => {\n const market = await query.queryMarket(indexer);\n\n let supplyValue = BigNumber(0);\n let borrowValue = BigNumber(0);\n\n if (indexer) {\n const tvl = await query.indexer.getTotalValueLocked();\n return {\n supplyValue: tvl.supplyValue,\n borrowValue: tvl.borrowValue,\n totalValue: tvl.totalValue,\n };\n }\n\n for (const pool of Object.values(market.pools)) {\n supplyValue = supplyValue.plus(\n BigNumber(pool.supplyCoin).multipliedBy(pool.coinPrice)\n );\n borrowValue = borrowValue.plus(\n BigNumber(pool.borrowCoin).multipliedBy(pool.coinPrice)\n );\n }\n\n for (const collateral of Object.values(market.collaterals)) {\n supplyValue = supplyValue.plus(\n BigNumber(collateral.depositCoin).multipliedBy(collateral.coinPrice)\n );\n }\n\n const tvl: TotalValueLocked = {\n supplyValue: supplyValue.toNumber(),\n borrowValue: borrowValue.toNumber(),\n totalValue: supplyValue.minus(borrowValue).toNumber(),\n };\n\n return tvl;\n};\n","import axios, { AxiosInstance } from 'axios';\nimport { SDK_API_BASE_URL } from '../constants';\nimport type {\n Market,\n MarketPools,\n MarketPool,\n MarketCollaterals,\n MarketCollateral,\n Spools,\n Spool,\n BorrowIncentivePools,\n BorrowIncentivePool,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n TotalValueLocked,\n} from '../types';\n\n/**\n * @description\n * It provides methods to obtain sdk index data from mainnet.\n *\n *\n * @example\n * ```typescript\n * const scallopIndexer = new scallopIndexer(<parameters>);\n * scallopIndexer.<indexer functions>();\n * await scallopIndexer.<indexer async functions>();\n * ```\n */\nexport class ScallopIndexer {\n private _requestClient: AxiosInstance;\n\n public constructor() {\n this._requestClient = axios.create({\n baseURL: SDK_API_BASE_URL,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30000,\n });\n }\n\n /**\n * Get market index data.\n *\n * @return Market data.\n */\n public async getMarket(): Promise<Pick<Market, 'pools' | 'collaterals'>> {\n const response = await this._requestClient.get<{\n pools: MarketPool[];\n collaterals: MarketCollateral[];\n }>(`${SDK_API_BASE_URL}/api/market`);\n\n if (response.status === 200) {\n return {\n pools: response.data.pools.reduce((marketPools, marketPool) => {\n marketPools[marketPool.coinName] = marketPool;\n return marketPools;\n }, {} as MarketPools),\n collaterals: response.data.collaterals.reduce(\n (marketCollaterals, marketCollateral) => {\n marketCollaterals[marketCollateral.coinName] = marketCollateral;\n return marketCollaterals;\n },\n {} as MarketCollaterals\n ),\n };\n } else {\n throw Error('Failed to getMarket.');\n }\n }\n\n /**\n * Get market pools index data.\n *\n * @return Market pools data.\n */\n public async getMarketPools(): Promise<Required<MarketPools>> {\n const response = await this._requestClient.get<{\n pools: MarketPool[];\n }>(`${SDK_API_BASE_URL}/api/market/pools`);\n\n if (response.status === 200) {\n return response.data.pools.reduce((marketPools, marketPool) => {\n marketPools[marketPool.coinName] = marketPool;\n return marketPools;\n }, {} as MarketPools) as Required<MarketPools>;\n } else {\n throw Error('Failed to getMarketPools.');\n }\n }\n\n /**\n * Get market pool index data.\n *\n * @return Market pool data.\n */\n public async getMarketPool(\n poolCoinName: SupportPoolCoins\n ): Promise<MarketPool> {\n const response = await this._requestClient.get<{\n pool: MarketPool;\n }>(`${SDK_API_BASE_URL}/api/market/pool/${poolCoinName}`);\n\n if (response.status === 200) {\n return response.data.pool;\n } else {\n throw Error('Failed to getMarketPool.');\n }\n }\n\n /**\n * Get market collaterals index data.\n *\n * @return Market collaterals data.\n */\n public async getMarketCollaterals(): Promise<Required<MarketCollaterals>> {\n const response = await this._requestClient.get<{\n collaterals: MarketCollateral[];\n }>(`${SDK_API_BASE_URL}/api/market/collaterals`);\n\n if (response.status === 200) {\n return response.data.collaterals.reduce(\n (marketCollaterals, marketCollateral) => {\n marketCollaterals[marketCollateral.coinName] = marketCollateral;\n return marketCollaterals;\n },\n {} as MarketCollaterals\n ) as Required<MarketCollaterals>;\n } else {\n throw Error('Failed to getMarketCollaterals.');\n }\n }\n\n /**\n * Get market collateral index data.\n *\n * @return Market collateral data.\n */\n public async getMarketCollateral(\n collateralCoinName: SupportCollateralCoins\n ): Promise<MarketCollateral> {\n const response = await this._requestClient.get<{\n collateral: MarketCollateral;\n }>(`${SDK_API_BASE_URL}/api/market/collateral/${collateralCoinName}`);\n\n if (response.status === 200) {\n return response.data.collateral;\n } else {\n throw Error('Failed to getMarketCollateral.');\n }\n }\n\n /**\n * Get spools index data.\n *\n * @return Spools data.\n */\n public async getSpools(): Promise<Required<Spools>> {\n const response = await this._requestClient.get<{\n spools: Spool[];\n }>(`${SDK_API_BASE_URL}/api/spools`);\n\n if (response.status === 200) {\n return response.data.spools.reduce((spools, spool) => {\n spools[spool.marketCoinName] = spool;\n return spools;\n }, {} as Spools) as Required<Spools>;\n } else {\n throw Error('Failed to getSpools.');\n }\n }\n\n /**\n * Get spool index data.\n *\n * @return Spool data.\n */\n public async getSpool(\n marketCoinName: SupportStakeMarketCoins\n ): Promise<Spool> {\n const response = await this._requestClient.get<{\n spool: Spool;\n }>(`${SDK_API_BASE_URL}/api/spool/${marketCoinName}`);\n\n if (response.status === 200) {\n return response.data.spool;\n } else {\n throw Error('Failed to getSpool.');\n }\n }\n\n /**\n * Get borrow incentive pools index data.\n *\n * @return Borrow incentive pools data.\n */\n public async getBorrowIncentivePools(): Promise<\n Required<BorrowIncentivePools>\n > {\n const response = await this._requestClient.get<{\n borrowIncentivePools: BorrowIncentivePool[];\n }>(`${SDK_API_BASE_URL}/api/borrowIncentivePools`);\n\n if (response.status === 200) {\n return response.data.borrowIncentivePools.reduce(\n (borrowIncentivePools, borrowIncentivePool) => {\n borrowIncentivePools[borrowIncentivePool.coinName] =\n borrowIncentivePool;\n return borrowIncentivePools;\n },\n {} as BorrowIncentivePools\n ) as Required<BorrowIncentivePools>;\n } else {\n throw Error('Failed to getBorrowIncentivePools.');\n }\n }\n\n /**\n * Get borrow incentive pool index data.\n *\n * @return Borrow incentive pool data.\n */\n public async getBorrowIncentivePool(\n borrowIncentiveCoinName: SupportBorrowIncentiveCoins\n ): Promise<BorrowIncentivePool> {\n const response = await this._requestClient.get<{\n borrowIncentivePool: BorrowIncentivePool;\n }>(\n `${SDK_API_BASE_URL}/api/borrowIncentivePool/${borrowIncentiveCoinName}`\n );\n\n if (response.status === 200) {\n return response.data.borrowIncentivePool;\n } else {\n throw Error('Failed to getSpool.');\n }\n }\n\n /**\n * Get total value locked index data.\n *\n * @return Total value locked.\n */\n public async getTotalValueLocked(): Promise<\n TotalValueLocked & {\n totalValueChangeRatio: number;\n borrowValueChangeRatio: number;\n supplyValueChangeRatio: number;\n }\n > {\n const response = await this._requestClient.get<\n TotalValueLocked & {\n totalValueChangeRatio: number;\n borrowValueChangeRatio: number;\n supplyValueChangeRatio: number;\n }\n >(`${SDK_API_BASE_URL}/api/market/tvl`);\n\n if (response.status === 200) {\n return response.data;\n } else {\n throw Error('Failed to getTotalValueLocked.');\n }\n }\n}\n","import { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ADDRESSES_ID } from '../constants';\nimport { newScallopTxBlock } from '../builders';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport type { SuiTransactionBlockResponse } from '@mysten/sui.js/client';\nimport type { TransactionBlock } from '@mysten/sui.js/transactions';\nimport type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport type {\n ScallopInstanceParams,\n ScallopBuilderParams,\n ScallopTxBlock,\n SupportMarketCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * @description\n * It provides methods for operating the transaction block, making it more convenient to organize transaction combinations.\n *\n * @example\n * ```typescript\n * const scallopBuilder = new ScallopBuilder(<parameters>);\n * await scallopBuilder.init();\n * const txBlock = scallopBuilder.<builder functions>();\n * ```\n */\nexport class ScallopBuilder {\n public readonly params: ScallopBuilderParams;\n public readonly isTestnet: boolean;\n\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public query: ScallopQuery;\n public utils: ScallopUtils;\n public walletAddress: string;\n\n public constructor(\n params: ScallopBuilderParams,\n instance?: ScallopInstanceParams\n ) {\n this.params = params;\n this.suiKit = instance?.suiKit ?? new SuiKit(params);\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n suiKit: this.suiKit,\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n suiKit: this.suiKit,\n address: this.address,\n query: this.query,\n });\n this.walletAddress = normalizeSuiAddress(\n params?.walletAddress || this.suiKit.currentAddress()\n );\n this.isTestnet = params.networkType\n ? params.networkType === 'testnet'\n : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param forece - Whether to force initialization.\n */\n public async init(forece: boolean = false) {\n if (forece || !this.address.getAddresses()) {\n await this.address.read();\n }\n await this.query.init(forece);\n await this.utils.init(forece);\n }\n\n /**\n * Create a scallop txBlock instance that enhances transaction block.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop txBlock.\n */\n public createTxBlock(\n txBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n ) {\n return newScallopTxBlock(this, txBlock);\n }\n\n /**\n * Specifying the sender's amount of coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param assetCoinName - Specific support asset coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n assetCoinName: SupportAssetCoins,\n amount: number,\n sender: string\n ) {\n const coinType = this.utils.parseCoinType(assetCoinName);\n const coins = await this.utils.selectCoinIds(amount, coinType, sender);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Specifying the sender's amount of market coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support market coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectMarketCoin(\n txBlock: ScallopTxBlock | SuiKitTxBlock,\n marketCoinName: SupportMarketCoins,\n amount: number,\n sender: string\n ) {\n const marketCoinType = this.utils.parseMarketCoinType(marketCoinName);\n const coins = await this.utils.selectCoinIds(\n amount,\n marketCoinType,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Execute Scallop txBlock using the `signAndSendTxn` methods in suikit.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n */\n public async signAndSendTxBlock(\n txBlock: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n ) {\n return (await this.suiKit.signAndSendTxn(\n txBlock\n )) as SuiTransactionBlockResponse;\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { getObligations } from '../queries';\nimport { updateOracles } from './oracle';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n CoreIds,\n GenerateCoreNormalMethod,\n GenerateCoreQuickMethod,\n SuiTxBlockWithCoreNormalMethods,\n CoreTxBlock,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (params.length === 3 && obligationId) return { obligationId };\n if (params.length === 4 && obligationId && obligationKey)\n return { obligationId, obligationKey };\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n };\n};\n\n/**\n * Generate core normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core normal methods.\n */\nconst generateCoreNormalMethod: GenerateCoreNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const coreIds: CoreIds = {\n protocolPkg: builder.address.get('core.packages.protocol.id'),\n market: builder.address.get('core.market'),\n version: builder.address.get('core.version'),\n coinDecimalsRegistry: builder.address.get('core.coinDecimalsRegistry'),\n xOracle: builder.address.get('core.oracles.xOracle'),\n };\n return {\n openObligation: () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n [coreIds.version]\n ),\n returnObligation: (obligation, obligationHotPotato) =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n [coreIds.version, obligation, obligationHotPotato]\n ),\n openObligationEntry: () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n [coreIds.version]\n ),\n addCollateral: (obligation, coin, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n [coreIds.version, obligation, coreIds.market, coin],\n [coinType]\n );\n },\n takeCollateral: (obligation, obligationKey, amount, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n deposit: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::mint::mint`,\n [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n depositEntry: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::mint::mint_entry`,\n [coreIds.version, coreIds.market, coin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n withdraw: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::redeem::redeem`,\n [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n withdrawEntry: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::redeem::redeem_entry`,\n [coreIds.version, coreIds.market, marketCoin, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n },\n borrow: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow_entry`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.coinDecimalsRegistry,\n amount,\n coreIds.xOracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n repay: (obligation, coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::repay::repay`,\n [\n coreIds.version,\n obligation,\n coreIds.market,\n coin,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowFlashLoan: (amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n [coreIds.version, coreIds.market, amount],\n [coinType]\n );\n },\n repayFlashLoan: (coin, loan, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::repay_flash_loan`,\n [coreIds.version, coreIds.market, coin, loan],\n [coinType]\n );\n },\n };\n};\n\n/**\n * Generate core quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include query obligation info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core quick methods.\n */\nconst generateCoreQuickMethod: GenerateCoreQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n addCollateralQuick: async (amount, collateralCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (collateralCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n txBlock.addCollateral(obligationArg, suiCoin, collateralCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n collateralCoinName,\n amount,\n sender\n );\n txBlock.addCollateral(obligationArg, takeCoin, collateralCoinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick: async (\n amount,\n collateralCoinName,\n obligationId,\n obligationKey\n ) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const updateCoinNames = await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n );\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.takeCollateral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n collateralCoinName\n );\n },\n depositQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.deposit(suiCoin, poolCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.deposit(takeCoin, poolCoinName);\n }\n },\n withdrawQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n const marketCoinName = builder.utils.parseMarketCoinName(poolCoinName);\n const { leftCoin, takeCoin } = await builder.selectMarketCoin(\n txBlock,\n marketCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.withdraw(takeCoin, poolCoinName);\n },\n borrowQuick: async (amount, poolCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId,\n obligationKey\n );\n const obligationCoinNames = await builder.utils.getObligationCoinNames(\n obligationInfo.obligationId\n );\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return txBlock.borrow(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n poolCoinName\n );\n },\n repayQuick: async (amount, poolCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const obligationInfo = await requireObligationInfo(\n builder,\n txBlock,\n obligationId\n );\n\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.repay(\n obligationInfo.obligationId,\n suiCoin,\n poolCoinName\n );\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock,\n poolCoinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.repay(\n obligationInfo.obligationId,\n takeCoin,\n poolCoinName\n );\n }\n },\n updateAssetPricesQuick: async (assetCoinNames) => {\n return updateOracles(builder, txBlock, assetCoinNames);\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with core modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop core txBlock.\n */\nexport const newCoreTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateCoreNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithCoreNormalMethods;\n\n const quickMethod = generateCoreQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as CoreTxBlock;\n};\n","import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport {\n SuiPythClient,\n SuiPriceServiceConnection,\n} from '@pythnetwork/pyth-sui-js';\nimport { SUPPORT_COLLATERALS, SUPPORT_POOLS } from '../constants';\nimport type { TransactionArgument } from '@mysten/sui.js/transactions';\nimport type { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type { SupportAssetCoins, SupportOracleType } from '../types';\n\n/**\n * Update the price of the oracle for multiple coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinNames - Specific an array of support asset coin name.\n */\nexport const updateOracles = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinNames?: SupportAssetCoins[]\n) => {\n assetCoinNames = assetCoinNames ?? [\n ...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS]),\n ];\n const rules: SupportOracleType[] = builder.isTestnet ? ['pyth'] : ['pyth'];\n if (rules.includes('pyth')) {\n const pythClient = new SuiPythClient(\n builder.suiKit.client(),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get('core.oracles.pyth.wormholeState')\n );\n const priceIds = assetCoinNames.map((assetCoinName) =>\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`)\n );\n const pythConnection = new SuiPriceServiceConnection(\n builder.isTestnet\n ? 'https://hermes-beta.pyth.network'\n : 'https://hermes.pyth.network'\n );\n const priceUpdateData =\n await pythConnection.getPriceFeedsUpdateData(priceIds);\n await pythClient.updatePriceFeeds(\n txBlock.txBlock,\n priceUpdateData,\n priceIds\n );\n }\n\n // Remove duplicate coin names.\n const updateAssetCoinNames = [...new Set(assetCoinNames)];\n for (const assetCoinName of updateAssetCoinNames) {\n await updateOracle(builder, txBlock, assetCoinName, rules);\n }\n};\n\n/**\n * Update the price of the oracle for specific coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinName - Specific support asset coin name.\n */\nconst updateOracle = async (\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n assetCoinName: SupportAssetCoins,\n rules: SupportOracleType[]\n) => {\n const coinType = builder.utils.parseCoinType(assetCoinName);\n\n updatePrice(\n txBlock,\n rules,\n builder.address.get('core.packages.xOracle.id'),\n builder.address.get('core.oracles.xOracle'),\n builder.address.get('core.packages.pyth.id'),\n builder.address.get('core.oracles.pyth.registry'),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`),\n builder.address.get('core.packages.switchboard.id'),\n builder.address.get('core.oracles.switchboard.registry'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.switchboard`),\n builder.address.get('core.packages.supra.id'),\n builder.address.get('core.oracles.supra.registry'),\n builder.address.get(`core.oracles.supra.holder`),\n coinType\n );\n};\n\n/**\n * Construct a transaction block for update the price.\n *\n * @param txBlock - The transaction block.\n * @param rules - The oracle rules.\n * @param xOraclePackageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param pythPackageId - The pyth package id.\n * @param pythRegistryId - The registry id from pyth package.\n * @param pythStateId - The price state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param switchboardPackageId - The switchboard package id.\n * @param switchboardRegistryId - The registry id from switchboard package.\n * @param switchboardAggregatorId - The aggregator id from switchboard package.\n * @param supraPackageId - The supra package id.\n * @param supraRegistryId - The registry id from supra package.\n * @param supraHolderId - The holder id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePrice = (\n txBlock: SuiKitTxBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n switchboardPackageId: string,\n switchboardRegistryId: TransactionArgument | string,\n switchboardAggregatorId: TransactionArgument | string,\n supraPackageId: string,\n supraRegistryId: TransactionArgument | string,\n supraHolderId: TransactionArgument | string,\n coinType: string\n) => {\n const request = priceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n coinType\n );\n if (rules.includes('pyth')) {\n updatePythPrice(\n txBlock,\n pythPackageId,\n request,\n pythStateId,\n pythFeedObjectId,\n pythRegistryId,\n coinType\n );\n }\n if (rules.includes('switchboard')) {\n updateSwitchboardPrice(\n txBlock,\n switchboardPackageId,\n request,\n switchboardAggregatorId,\n switchboardRegistryId,\n coinType\n );\n }\n if (rules.includes('supra')) {\n updateSupraPrice(\n txBlock,\n supraPackageId,\n request,\n supraHolderId,\n supraRegistryId,\n coinType\n );\n }\n confirmPriceUpdateRequest(\n txBlock,\n xOraclePackageId,\n xOracleId,\n request,\n coinType\n );\n return txBlock;\n};\n\n/**\n * Construct a transaction block for request price update.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst priceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::price_update_request`;\n const typeArgs = [coinType];\n return txBlock.moveCall(target, [xOracleId], typeArgs);\n};\n\n/**\n * Construct a transaction block for confirm price update request.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param request - The result of the request.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst confirmPriceUpdateRequest = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n request: TransactionArgument,\n coinType: string\n) => {\n const target = `${packageId}::x_oracle::confirm_price_update_request`;\n const typeArgs = [coinType];\n txBlock.moveCall(target, [xOracleId, request, SUI_CLOCK_OBJECT_ID], typeArgs);\n return txBlock;\n};\n\n/**\n * Construct a transaction block for update supra price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The supra package id.\n * @param request - The result of the request.\n * @param holderId - The holder id from supra package.\n * @param registryId - The registry id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSupraPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n holderId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, holderId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update switchboard price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The switchboard package id.\n * @param request - The result of the request.\n * @param aggregatorId - The aggregator id from switchboard package.\n * @param registryId - The registry id from switchboard package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSwitchboardPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n aggregatorId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, aggregatorId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n\n/**\n * Construct a transaction block for update pyth price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The pyth package id.\n * @param request - The result of the request.\n * @param stateId - The price state id from pyth package.\n * @param wormholeStateId - The whormhole state id from pyth package.\n * @param feedObjectId - The feed object id from pyth package.\n * @param vaaFromFeeId - The vaa from pyth api with feed id.\n * @param registryId - The registry id from pyth package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePythPrice = (\n txBlock: SuiKitTxBlock,\n packageId: string,\n request: TransactionArgument,\n stateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string\n) => {\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [request, stateId, feedObjectId, registryId, SUI_CLOCK_OBJECT_ID],\n [coinType]\n );\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { spoolRewardCoins } from '../constants/enum';\nimport { getStakeAccounts } from '../queries/spoolQuery';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { TransactionResult } from '@mysten/sui.js/transactions';\nimport type { ScallopBuilder } from '../models';\nimport type {\n SpoolIds,\n GenerateSpoolNormalMethod,\n GenerateSpoolQuickMethod,\n SuiTxBlockWithSpoolNormalMethods,\n SpoolTxBlock,\n SupportStakeMarketCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get stake account id from transaction block.\n *\n * @description\n * If the stake account id is provided, direactly return it.\n * Otherwise, automatically get all stake account id from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake account ids.\n */\nconst requireStakeAccountIds = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n if (params.length === 4 && stakeAccountId) return [stakeAccountId];\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account id found for sender ${sender}`);\n }\n return stakeAccounts[stakeMarketCoinName].map((account) => account.id);\n};\n\n/**\n * Check and get stake accounts information from transaction block.\n *\n * @description\n * If the stake account id is provided, direactly return its account.\n * Otherwise, automatically get all stake account from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake accounts.\n */\nconst requireStakeAccounts = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account found for sender ${sender}`);\n }\n\n const specificStakeAccounts = stakeAccountId\n ? stakeAccounts[stakeMarketCoinName].filter((account) => {\n return account.id === stakeAccountId;\n })\n : stakeAccounts[stakeMarketCoinName];\n\n return specificStakeAccounts;\n};\n\n/**\n * Generate spool normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool normal methods.\n */\nconst generateSpoolNormalMethod: GenerateSpoolNormalMethod = ({\n builder,\n txBlock,\n}) => {\n const spoolIds: SpoolIds = {\n spoolPkg: builder.address.get('spool.id'),\n };\n return {\n createStakeAccount: (stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::new_spool_account`,\n [stakePoolId, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n stake: (stakeAccount, coin, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::stake`,\n [stakePoolId, stakeAccount, coin, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n unstake: (stakeAccount, amount, stakeMarketCoinName) => {\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::unstake`,\n [stakePoolId, stakeAccount, amount, SUI_CLOCK_OBJECT_ID],\n [marketCoinType]\n );\n },\n claim: (stakeAccount, stakeMarketCoinName) => {\n const stakePoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.id`\n );\n const rewardPoolId = builder.address.get(\n `spool.pools.${stakeMarketCoinName}.rewardPoolId`\n );\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const rewardCoinName = spoolRewardCoins[stakeMarketCoinName];\n const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall(\n `${spoolIds.spoolPkg}::user::redeem_rewards`,\n [stakePoolId, rewardPoolId, stakeAccount, SUI_CLOCK_OBJECT_ID],\n [marketCoinType, rewardCoinType]\n );\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nconst generateSpoolQuickMethod: GenerateSpoolQuickMethod = ({\n builder,\n txBlock,\n}) => {\n return {\n stakeQuick: async (\n amountOrMarketCoin,\n stakeMarketCoinName,\n stakeAccountId\n ) => {\n const sender = requireSender(txBlock);\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n\n const marketCoinType =\n builder.utils.parseMarketCoinType(stakeMarketCoinName);\n if (typeof amountOrMarketCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(\n amountOrMarketCoin,\n marketCoinType,\n sender\n );\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(\n coins,\n amountOrMarketCoin\n );\n txBlock.stake(stakeAccountIds[0], takeCoin, stakeMarketCoinName);\n txBlock.transferObjects([leftCoin], sender);\n } else {\n txBlock.stake(\n stakeAccountIds[0],\n amountOrMarketCoin,\n stakeMarketCoinName\n );\n }\n },\n unstakeQuick: async (amount, stakeMarketCoinName, stakeAccountId) => {\n const stakeAccounts = await requireStakeAccounts(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const stakeMarketCoins: TransactionResult[] = [];\n for (const account of stakeAccounts) {\n if (account.staked === 0) continue;\n const amountToUnstake = Math.min(amount, account.staked);\n const marketCoin = txBlock.unstake(\n account.id,\n amountToUnstake,\n stakeMarketCoinName\n );\n stakeMarketCoins.push(marketCoin);\n amount -= amountToUnstake;\n if (amount === 0) break;\n }\n return stakeMarketCoins;\n },\n claimQuick: async (stakeMarketCoinName, stakeAccountId) => {\n const stakeAccountIds = await requireStakeAccountIds(\n builder,\n txBlock,\n stakeMarketCoinName,\n stakeAccountId\n );\n const rewardCoins: TransactionResult[] = [];\n for (const accountId of stakeAccountIds) {\n const rewardCoin = txBlock.claim(accountId, stakeMarketCoinName);\n rewardCoins.push(rewardCoin);\n }\n return rewardCoins;\n },\n };\n};\n\n/**\n * Create an enhanced transaction block instance for interaction with spool modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop spool txBlock.\n */\nexport const newSpoolTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateSpoolNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithSpoolNormalMethods;\n\n const quickMethod = generateSpoolQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SpoolTxBlock;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { borrowIncentiveRewardCoins } from '../constants/enum';\nimport { getObligations, getObligationLocked } from '../queries';\nimport { requireSender } from '../utils';\nimport type { SuiAddressArg } from '@scallop-io/sui-kit';\nimport type { ScallopBuilder } from '../models';\nimport type {\n BorrowIncentiveIds,\n GenerateBorrowIncentiveNormalMethod,\n GenerateBorrowIncentiveQuickMethod,\n SuiTxBlockWithBorrowIncentiveNormalMethods,\n BorrowIncentiveTxBlock,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: SuiKitTxBlock,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (\n params.length === 4 &&\n obligationId &&\n obligationKey &&\n typeof obligationId === 'string'\n ) {\n const obligationLocked = await getObligationLocked(\n builder.query,\n obligationId\n );\n return { obligationId, obligationKey, obligationLocked };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n obligationLocked: obligations[0].locked,\n };\n};\n\n/**\n * Generate borrow incentive normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow incentive normal methods.\n */\nconst generateBorrowIncentiveNormalMethod: GenerateBorrowIncentiveNormalMethod =\n ({ builder, txBlock }) => {\n const borrowIncentiveIds: BorrowIncentiveIds = {\n borrowIncentivePkg: builder.address.get('borrowIncentive.id'),\n query: builder.address.get('borrowIncentive.query'),\n incentivePools: builder.address.get('borrowIncentive.incentivePools'),\n incentiveAccounts: builder.address.get(\n 'borrowIncentive.incentiveAccounts'\n ),\n obligationAccessStore: builder.address.get('core.obligationAccessStore'),\n };\n return {\n stakeObligation: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::stake`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n borrowIncentiveIds.obligationAccessStore,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n unstakeObligation: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n claimBorrowIncentive: (obligationId, obligaionKey, coinName) => {\n const rewardCoinName = borrowIncentiveRewardCoins[coinName];\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall(\n `${borrowIncentiveIds.borrowIncentivePkg}::user::redeem_rewards`,\n [\n borrowIncentiveIds.incentivePools,\n borrowIncentiveIds.incentiveAccounts,\n obligaionKey,\n obligationId,\n SUI_CLOCK_OBJECT_ID,\n ],\n [rewardType]\n );\n },\n };\n };\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nconst generateBorrowIncentiveQuickMethod: GenerateBorrowIncentiveQuickMethod =\n ({ builder, txBlock }) => {\n return {\n stakeObligationQuick: async (coinName, obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n const unstakeObligationBeforeStake =\n !!txBlock.txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n txn.target ===\n `${builder.address.get('borrowIncentive.id')}::user::unstake`\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n txBlock.stakeObligation(obligationArg, obligationtKeyArg, coinName);\n }\n },\n unstakeObligationQuick: async (coinName, obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked: obligationLocked,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n if (obligationLocked) {\n txBlock.unstakeObligation(obligationArg, obligationtKeyArg, coinName);\n }\n },\n claimBorrowIncentiveQuick: async (\n coinName,\n obligation,\n obligationKey\n ) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n } = await requireObligationInfo(\n builder,\n txBlock,\n obligation,\n obligationKey\n );\n\n return txBlock.claimBorrowIncentive(\n obligationArg,\n obligationtKeyArg,\n coinName\n );\n },\n };\n };\n\n/**\n * Create an enhanced transaction block instance for interaction with borrow incentive modules of the Scallop contract.\n *\n * @param builder - Scallop builder instance.\n * @param initTxBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop borrow incentive txBlock.\n */\nexport const newBorrowIncentiveTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n) => {\n const txBlock =\n initTxBlock instanceof TransactionBlock\n ? new SuiKitTxBlock(initTxBlock)\n : initTxBlock\n ? initTxBlock\n : new SuiKitTxBlock();\n\n const normalMethod = generateBorrowIncentiveNormalMethod({\n builder,\n txBlock,\n });\n\n const normalTxBlock = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in normalMethod) {\n return Reflect.get(normalMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as SuiTxBlockWithBorrowIncentiveNormalMethods;\n\n const quickMethod = generateBorrowIncentiveQuickMethod({\n builder,\n txBlock: normalTxBlock,\n });\n\n return new Proxy(normalTxBlock, {\n get: (target, prop) => {\n if (prop in quickMethod) {\n return Reflect.get(quickMethod, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as BorrowIncentiveTxBlock;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiTxBlock as SuiKitTxBlock } from '@scallop-io/sui-kit';\nimport { newCoreTxBlock } from './coreBuilder';\nimport { newSpoolTxBlock } from './spoolBuilder';\nimport { newBorrowIncentiveTxBlock } from './borrowIncentiveBuilder';\nimport type { ScallopBuilder } from '../models';\nimport type { ScallopTxBlock } from '../types';\n\n/**\n * Create a new ScallopTxBlock instance.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return ScallopTxBlock.\n */\nexport const newScallopTxBlock = (\n builder: ScallopBuilder,\n initTxBlock?: ScallopTxBlock | SuiKitTxBlock | TransactionBlock\n): ScallopTxBlock => {\n const borrowIncentiveTxBlock = newBorrowIncentiveTxBlock(\n builder,\n initTxBlock\n );\n const spoolTxBlock = newSpoolTxBlock(builder, borrowIncentiveTxBlock);\n const coreTxBlock = newCoreTxBlock(builder, spoolTxBlock);\n\n return new Proxy(coreTxBlock, {\n get: (target, prop) => {\n if (prop in borrowIncentiveTxBlock) {\n return Reflect.get(borrowIncentiveTxBlock, prop);\n } else if (prop in spoolTxBlock) {\n return Reflect.get(spoolTxBlock, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as ScallopTxBlock;\n};\n"],"mappings":"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","names":["SuiKit","network","addresses","normalizeSuiAddress","SuiKit","normalizeStructTag","SuiKit","normalizeStructTag","BigNumber","assetCoinName","normalizeStructTag","BigNumber","normalizeStructTag","coinName","normalizeStructTag","normalizeStructTag","SuiKitTxBlock","SuiKitTxBlock","normalizeStructTag","rewardCoinName","BigNumber","marketCoinName","BigNumber","collateral","requiredCollateralValue","debt","tvl","axios","axios","SuiKit","normalizeStructTag","SuiKit","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","SuiPriceServiceConnection","SuiPriceServiceConnection","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","TransactionBlock","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","SUI_CLOCK_OBJECT_ID","stakeMarketCoins","TransactionBlock","SuiKitTxBlock","TransactionBlock","SUI_CLOCK_OBJECT_ID","SuiKitTxBlock","requireObligationInfo","SUI_CLOCK_OBJECT_ID","TransactionBlock","SuiKitTxBlock","SuiKit","SuiKit","normalizeSuiAddress","marketCoins","stakeMarketCoins","SuiKit"]}