@scallop-io/sui-scallop-sdk 0.37.7 → 0.37.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -612,7 +612,7 @@ var ScallopUtils = class {
612
612
  // src/queries/market.ts
613
613
  var import_sui_kit2 = require("@scallop-io/sui-kit");
614
614
  var import_bignumber = __toESM(require("bignumber.js"));
615
- var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
615
+ var queryMarket = async (scallopAddress, suiKit, scallopUtils, rateType) => {
616
616
  const packageId = scallopAddress.get("core.packages.query.id");
617
617
  const marketId = scallopAddress.get("core.market");
618
618
  const txBlock = new import_sui_kit2.SuiTxBlock();
@@ -624,7 +624,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
624
624
  const collaterals = [];
625
625
  for (const asset of marketData.pools) {
626
626
  const coinType = "0x" + asset.type.name;
627
- const borrowAPYFactor = 24 * 365 * 3600;
627
+ const borrowYearFactor = 24 * 365 * 3600;
628
628
  const baseBorrowRate = Number(asset.baseBorrowRatePerSec.value) / 2 ** 32;
629
629
  const borrowRateOnHighKink = Number(asset.borrowRateOnHighKink.value) / 2 ** 32;
630
630
  const borrowRateOnMidKink = Number(asset.borrowRateOnMidKink.value) / 2 ** 32;
@@ -642,11 +642,11 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
642
642
  const reserve = Number(asset.reserve);
643
643
  const reserveFactor = Number(asset.reserveFactor.value) / 2 ** 32;
644
644
  const borrowWeight = Number(asset.borrowWeight.value) / 2 ** 32;
645
- const caculatedBaseBorrowRate = (0, import_bignumber.default)(baseBorrowRate).multipliedBy(borrowAPYFactor).dividedBy(borrowRateScale).toNumber();
646
- const caculatedBorrowRateOnHighKink = (0, import_bignumber.default)(borrowRateOnHighKink).multipliedBy(borrowAPYFactor).dividedBy(borrowRateScale).toNumber();
647
- const caculatedBorrowRateOnMidKink = (0, import_bignumber.default)(borrowRateOnMidKink).multipliedBy(borrowAPYFactor).dividedBy(borrowRateScale).toNumber();
648
- const caculatedMaxBorrowRate = (0, import_bignumber.default)(maxBorrowRate).multipliedBy(borrowAPYFactor).dividedBy(borrowRateScale).toNumber();
649
- const caculatedBorrowRate = (0, import_bignumber.default)(borrowRate).multipliedBy(borrowAPYFactor).dividedBy(borrowRateScale).toNumber();
645
+ const calculatedBaseBorrowRate = rateType === "apr" ? baseBorrowRate * borrowYearFactor / borrowRateScale : (1 + baseBorrowRate / borrowRateScale) ** borrowYearFactor - 1;
646
+ const calculatedBorrowRateOnHighKink = rateType === "apr" ? borrowRateOnHighKink * borrowYearFactor / borrowRateScale : (1 + borrowRateOnHighKink / borrowRateScale) ** borrowYearFactor - 1;
647
+ const calculatedBorrowRateOnMidKink = rateType === "apr" ? borrowRateOnMidKink * borrowYearFactor / borrowRateScale : (1 + borrowRateOnMidKink / borrowRateScale) ** borrowYearFactor - 1;
648
+ const calculatedMaxBorrowRate = rateType === "apr" ? maxBorrowRate * borrowYearFactor / borrowRateScale : (1 + maxBorrowRate / borrowRateScale) ** borrowYearFactor - 1;
649
+ const calculatedBorrowRate = rateType === "apr" ? borrowRate * borrowYearFactor / borrowRateScale : (1 + borrowRate / borrowRateScale) ** borrowYearFactor - 1;
650
650
  const timeDelta = Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) - lastUpdated;
651
651
  const borrowIndexDelta = (0, import_bignumber.default)(borrowIndex).multipliedBy((0, import_bignumber.default)(timeDelta).multipliedBy(borrowRate)).dividedBy(borrowRateScale);
652
652
  const currentBorrowIndex = (0, import_bignumber.default)(borrowIndex).plus(borrowIndexDelta);
@@ -661,7 +661,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
661
661
  );
662
662
  let utilizationRate = (0, import_bignumber.default)(currentTotalDebt).dividedBy(currentTotalSupply);
663
663
  utilizationRate = utilizationRate.isFinite() ? utilizationRate : (0, import_bignumber.default)(0);
664
- let supplyRate = (0, import_bignumber.default)(caculatedBorrowRate).multipliedBy(utilizationRate).multipliedBy(1 - reserveFactor);
664
+ let supplyRate = (0, import_bignumber.default)(calculatedBorrowRate).multipliedBy(utilizationRate).multipliedBy(1 - reserveFactor);
665
665
  supplyRate = supplyRate.isFinite() ? supplyRate : (0, import_bignumber.default)(0);
666
666
  const coin = scallopUtils.getCoinNameFromCoinType(
667
667
  coinType
@@ -684,10 +684,10 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
684
684
  marketCoinType,
685
685
  calculated: {
686
686
  utilizationRate: utilizationRate.toNumber(),
687
- baseBorrowRate: caculatedBaseBorrowRate,
687
+ baseBorrowRate: calculatedBaseBorrowRate,
688
688
  borrowInterestRate: Math.min(
689
- caculatedBorrowRate,
690
- caculatedMaxBorrowRate
689
+ calculatedBorrowRate,
690
+ calculatedMaxBorrowRate
691
691
  ),
692
692
  supplyInterestRate: supplyRate.toNumber(),
693
693
  currentGrowthInterest: growthInterest.toNumber(),
@@ -699,11 +699,11 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
699
699
  origin: {
700
700
  highKink,
701
701
  midKink,
702
- baseBorrowRate: caculatedBaseBorrowRate,
703
- borrowRateOnHighKink: caculatedBorrowRateOnHighKink,
704
- borrowRateOnMidKink: caculatedBorrowRateOnMidKink,
705
- borrowRate: caculatedBorrowRate,
706
- maxBorrowRate: caculatedMaxBorrowRate,
702
+ baseBorrowRate: calculatedBaseBorrowRate,
703
+ borrowRateOnHighKink: calculatedBorrowRateOnHighKink,
704
+ borrowRateOnMidKink: calculatedBorrowRateOnMidKink,
705
+ borrowRate: calculatedBorrowRate,
706
+ maxBorrowRate: calculatedMaxBorrowRate,
707
707
  reserveFactor,
708
708
  borrowWeight,
709
709
  borrowIndex,
@@ -1362,10 +1362,11 @@ var ScallopClient = class {
1362
1362
  /**
1363
1363
  * Query market data.
1364
1364
  *
1365
+ * @param rateType - How interest rates are calculated.
1365
1366
  * @return Market data
1366
1367
  */
1367
- async queryMarket() {
1368
- return queryMarket(this.address, this.suiKit, this._utils);
1368
+ async queryMarket(rateType = "apr") {
1369
+ return queryMarket(this.address, this.suiKit, this._utils, rateType);
1369
1370
  }
1370
1371
  /**
1371
1372
  * Query obligations data.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants/common.ts","../src/models/scallop.ts","../src/models/scallopAddress.ts","../src/models/scallopClient.ts","../src/models/scallopUtils.ts","../src/queries/market.ts","../src/queries/obligation.ts","../src/txBuilders/normalMethods.ts","../src/txBuilders/oracle.ts","../src/txBuilders/coin.ts","../src/txBuilders/quickMethods.ts"],"sourcesContent":["export * from './constants';\nexport * from './models';\nexport * from './types';\n","export const API_BASE_URL = 'https://sui.api.scallop.io';\n\nexport const ADDRESSES_ID = '6462a088a7ace142bb6d7e9b';\n\nexport const SUPPORT_ASSET_COINS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n] as const;\nexport const SUPPORT_COLLATERAL_COINS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n] as const;\n\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 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n\nexport const SUI_COIN_TYPE_ARG_REGEX = /^0x(0*)2::sui::SUI$/;\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopClient } from './scallopClient';\nimport { ScallopUtils } from './scallopUtils';\nimport { newScallopTxBlock } from '../txBuilders';\nimport { ADDRESSES_ID } from '../constants';\nimport type { NetworkType } from '@scallop-io/sui-kit';\nimport type { ScallopParams, ScallopTxBlock } from '../types';\n\n/**\n * ### Scallop\n *\n * The main instance that controls interaction with the Scallop contract.\n *\n * #### Usage\n *\n * ```typescript\n * const sdk = new Scallop(<parameters>);\n * ```\n */\nexport class Scallop {\n public params: ScallopParams;\n public suiKit: SuiKit;\n public 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 * Create an instance to operate the transaction block, making it more convenient to organize transaction combinations.\n * @return Scallop Transaction Builder\n */\n public async createTxBuilder() {\n await this.address.read();\n const scallopUtils = new ScallopUtils(this.params);\n const suiKit = new SuiKit(this.params);\n const isTestnet = this.params.networkType === 'testnet';\n return {\n createTxBlock: () => {\n return newScallopTxBlock(suiKit, this.address, scallopUtils, isTestnet);\n },\n signAndSendTxBlock: (txBlock: ScallopTxBlock) => {\n return suiKit.signAndSendTxn(txBlock);\n },\n };\n }\n\n /**\n * Create an instance to collect the addresses, making it easier to get object addresses from lending contract.\n *\n * @param id - The API id of the addresses.\n * @param auth - The authentication API key.\n * @param network - Specifies which network's addresses you want to set.\n * @return Scallop Address\n */\n public createAddress(id: string, auth: string, network: NetworkType) {\n return new ScallopAddress({ id, auth, network });\n }\n\n /**\n * Create an instance that provides contract interaction operations for general users.\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 await this.address.read();\n return new ScallopClient(this.params, this.address, walletAddress);\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\n/**\n * it provides methods for managing addresses.\n */\nexport class ScallopAddress {\n private _apiClient: AxiosInstance;\n private _id?: string;\n private readonly _auth?: string;\n private readonly _network: NetworkType;\n private _addresses?: 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._apiClient = 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 * @returns The addresses API id.\n */\n public getId() {\n return this._id;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @returns The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._addresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object'\n ? nestedAddressObj[key]\n : nestedAddressObj,\n this._addresses\n );\n return value || undefined;\n } else {\n return undefined;\n }\n }\n\n /**\n * Set the address at the provided path.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @returns The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._addresses) {\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._addresses);\n }\n return this._addresses;\n }\n\n /**\n * Get the addresses.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @returns The addresses.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n } else {\n return this._addresses;\n }\n }\n\n /**\n * Set the addresses into addresses map.\n *\n * @param network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @returns The addresses.\n */\n public setAddresses(network?: NetworkType, addresses?: AddressesInterface) {\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (targetAddresses) {\n this._addressesMap.set(targetNetwork, targetAddresses);\n } else {\n // TODO: change to new format version\n this._addressesMap.set(targetNetwork, {\n core: {\n version: '',\n versionCap: '',\n market: '',\n adminCap: '',\n coinDecimalsRegistry: '',\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 },\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 // Deploy by pyth on testnet\n pyth: {\n id: '',\n upgradeCap: '',\n },\n // Deploy by ourself on testnet\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 });\n }\n }\n\n /**\n * Get all addresses.\n *\n * @returns All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n /**\n * Create a new address through the API and synchronize it back to the\n * instance. If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` is provided, an addresses with all empty strings is created\n * 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 network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @param auth - The authentication API key.\n * @returns The addresses.\n */\n public async create(\n network?: NetworkType,\n addresses?: AddressesInterface,\n auth?: string\n ) {\n const apiKey = auth || this._auth || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (apiKey !== undefined) {\n this._addressesMap.clear();\n this.setAddresses(targetNetwork, targetAddresses);\n const response = await this._apiClient.post(\n `${API_BASE_URL}/addresses`,\n JSON.stringify(Object.fromEntries(this._addressesMap)),\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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\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 * It doesn't read the data stored in the address instance, but reads and\n * synchronizes the data from the API into instance.\n *\n * @param id - The id of the addresses to get.\n * @returns The 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._apiClient.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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\n } else {\n throw Error('Failed to create addresses.');\n }\n }\n }\n\n /**\n * Update the address through the API and synchronize it back to the\n * instance. If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` is provided, an addresses with all empty strings is created\n * 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 id - The id of the addresses to update.\n * @param network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @param auth - The authentication api key.\n * @returns The addresses.\n */\n public async update(\n id?: string,\n network?: NetworkType,\n addresses?: AddressesInterface,\n auth?: string\n ) {\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (targetId === undefined) throw Error('Require addresses id.');\n if (apiKey !== undefined) {\n if (id !== this._id) {\n this._addressesMap.clear();\n }\n this.setAddresses(targetNetwork, targetAddresses);\n const response = await this._apiClient.put(\n `${API_BASE_URL}/addresses/${targetId}`,\n JSON.stringify(Object.fromEntries(this._addressesMap)),\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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\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 synchronizes\n * them back to 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 if (targetId === undefined) throw Error('Require addresses id.');\n if (apiKey !== undefined) {\n const response = await this._apiClient.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._addresses = 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';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { newScallopTxBlock } from '../txBuilders';\nimport { queryObligation, queryMarket, getObligations } from '../queries';\nimport type {\n TransactionArgument,\n SuiTransactionBlockResponse,\n} from '@mysten/sui.js';\nimport type { SuiTxArg } from '@scallop-io/sui-kit';\nimport type {\n ScallopClientFnReturnType,\n ScallopParams,\n SupportAssetCoins,\n SupportCollateralCoins,\n SupportCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * ### Scallop Client\n *\n * it provides contract interaction operations for general users.\n *\n * #### Usage\n *\n * ```typescript\n * const client = new Scallop(<parameters>);\n * client.<interact functions>();\n * ```\n */\nexport class ScallopClient {\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public walletAddress: string;\n\n private readonly _utils: ScallopUtils;\n private readonly _isTestnet: boolean;\n\n public constructor(\n params: ScallopParams,\n address: ScallopAddress,\n walletAddress?: string,\n isTestnet?: boolean\n ) {\n this.suiKit = new SuiKit(params);\n this.address = address;\n this.walletAddress = normalizeSuiAddress(\n walletAddress || this.suiKit.currentAddress()\n );\n this._utils = new ScallopUtils(params);\n this._isTestnet =\n isTestnet ||\n (params.networkType ? params.networkType === 'testnet' : false);\n }\n\n createTxBlock() {\n return newScallopTxBlock(\n this.suiKit,\n this.address,\n this._utils,\n this._isTestnet\n );\n }\n\n /**\n * Query market data.\n *\n * @return Market data\n */\n public async queryMarket() {\n return queryMarket(this.address, this.suiKit, this._utils);\n }\n\n /**\n * Query obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data\n */\n async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return getObligations(owner, this.address, this.suiKit);\n }\n\n /**\n * Query obligation data.\n *\n * @param obligationId - The obligation id from protocol package.\n * @return Obligation data\n */\n public async queryObligation(obligationId: string) {\n return queryObligation(obligationId, this.address, this.suiKit);\n }\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.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 coinName - 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 coinName: SupportCollateralCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositCollateral<S extends boolean>(\n coinName: SupportCollateralCoins,\n amount: number,\n sign?: S,\n obligationId?: SuiTxArg,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositCollateral<S extends boolean>(\n coinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId?: SuiTxArg,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n if (obligationId) {\n await txBlock.addCollateralQuick(amount, coinName, obligationId);\n } else {\n const [obligation, obligationKey, hotPotato] = txBlock.openObligation();\n await txBlock.addCollateralQuick(amount, coinName, 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 coinName - 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 coinName: 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.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await txBlock.takeCollateralQuick(\n amount,\n coinName,\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 coinName - Types of asset 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 coinName: SupportAssetCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async deposit<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async deposit<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await txBlock.depositQuick(amount, coinName);\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 * Withdraw asset from the specific pool, must return market coin.\n *\n * @param coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async withdraw<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async withdraw<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.withdrawQuick(amount, coinName);\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 coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\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.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.borrowQuick(\n amount,\n coinName,\n obligationId,\n obligationKey\n );\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 * Repay asset into the specific pool.\n *\n * @param coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.repayQuick(amount, coinName, obligationId);\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 coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument\n ): Promise<SuiTransactionBlockResponse>;\n public async flashLoan<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument,\n sign?: S\n ): Promise<ScallopClientFnReturnType<S>>;\n public async flashLoan<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument,\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const [coin, loan] = txBlock.borrowFlashLoan(amount, coinName);\n txBlock.repayFlashLoan(callback(txBlock, coin), loan, coinName);\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 * Mint and get test coin.\n *\n * @remarks\n * Only be used on the test network.\n *\n * @param coinName - Types of coins supported on the test network.\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 coinName: Exclude<SupportCoins, 'sui'>,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async mintTestCoin<S extends boolean>(\n coinName: Exclude<SupportCoins, 'sui'>,\n amount: number,\n sign?: S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async mintTestCoin<S extends boolean>(\n coinName: Exclude<SupportCoins, 'sui'>,\n amount: number,\n sign: S = true as S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n if (!this._isTestnet) {\n throw new Error('Only be used on the test network.');\n }\n\n const txBlock = this.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.${coinName}.treasury`);\n const target = `${packageId}::${coinName}::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 {\n SUI_FRAMEWORK_ADDRESS,\n SUI_TYPE_ARG,\n normalizeStructTag,\n} from '@mysten/sui.js';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { PriceServiceConnection } from '@pythnetwork/price-service-client';\nimport type { ScallopParams, SupportCoins } from '../types';\n\n/**\n * ### Scallop Utils\n *\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * #### Usage\n *\n * ```typescript\n * const utils = new ScallopUtils(<parameters>);\n * utils.<help functions>();\n * ```\n */\nexport class ScallopUtils {\n private _suiKit: SuiKit;\n\n public constructor(params: ScallopParams) {\n this._suiKit = new SuiKit(params);\n }\n\n /**\n * @description Select coin id that add up to the given amount as transaction arguments.\n * @param owner The address of the owner.\n * @param amount The amount that is needed for the coin.\n * @param coinType The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoins(\n owner: string,\n amount: number,\n coinType: string = SUI_TYPE_ARG\n ) {\n const coins = await this._suiKit.suiInteractor.selectCoins(\n owner,\n amount,\n coinType\n );\n return coins.map((c) => c.objectId);\n }\n\n /**\n * @description Fetch price feed VAAs of interest from the Pyth.\n * @param priceIds Array of hex-encoded price ids.\n * @param isTestnet Specify whether it is a test network.\n * @return Array of base64 encoded VAAs.\n */\n public async getVaas(priceIds: string[], isTestnet?: boolean) {\n const connection = new PriceServiceConnection(\n isTestnet\n ? 'https://xc-testnet.pyth.network'\n : 'https://xc-mainnet.pyth.network',\n {\n priceFeedRequestConfig: {\n binary: true,\n },\n }\n );\n return await connection.getLatestVaas(priceIds);\n }\n\n /**\n * @description Handle non-standard coins.\n * @param coinPackageId Package id of coin.\n * @param coinName specific support coin name.\n * @return coinType.\n */\n public parseCoinType(coinPackageId: string, coinName: string) {\n if (coinName === 'sui') return normalizeStructTag(SUI_TYPE_ARG);\n const wormHoleCoins = [\n // USDC\n '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n // USDT\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n // ETH\n '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n ];\n if (wormHoleCoins.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n } else {\n return `${coinPackageId}::${coinName}::${coinName.toUpperCase()}`;\n }\n }\n\n /**\n * @description Handle non-standard coin names.\n * @param coinPackageId Package id of coin.\n * @param coinName specific support coin name.\n * @return coinType.\n */\n public getCoinNameFromCoinType(coinType: string) {\n const wormHoleCoinTypes = [\n // USDC\n '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n // USDT\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n // ETH\n '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n ];\n\n if (coinType === wormHoleCoinTypes[0]) {\n return 'usdc';\n } else if (coinType === wormHoleCoinTypes[1]) {\n return 'usdt';\n } else if (coinType === wormHoleCoinTypes[2]) {\n return 'eth';\n } else {\n return coinType.split('::')[2].toLowerCase() as SupportCoins;\n }\n }\n\n /**\n * @description Handle market coin types.\n *\n * @param coinPackageId Package id of coin.\n * @param protocolPkgId Package id of protocol.\n * @param coinName specific support coin name.\n *\n * @return marketCoinType.\n */\n public parseMarketCoinType(\n coinPackageId: string,\n protocolPkgId: string,\n coinName: string\n ) {\n const coinType = this.parseCoinType(\n coinName === 'sui' ? SUI_FRAMEWORK_ADDRESS : coinPackageId,\n coinName\n );\n return `${protocolPkgId}::reserve::MarketCoin<${coinType}>`;\n }\n}\n","import { SuiKit, SuiTxBlock } from '@scallop-io/sui-kit';\nimport BigNumber from 'bignumber.js';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport {\n MarketInterface,\n MarketDataInterface,\n AssetPoolInterface,\n CollateralPoolInterface,\n SupportCollateralCoins,\n SupportAssetCoins,\n} from '../types';\n\nexport const queryMarket = async (\n scallopAddress: ScallopAddress,\n suiKit: SuiKit,\n scallopUtils: ScallopUtils\n) => {\n const packageId = scallopAddress.get('core.packages.query.id');\n const marketId = scallopAddress.get('core.market');\n const txBlock = new SuiTxBlock();\n const queryTarget = `${packageId}::market_query::market_data`;\n txBlock.moveCall(queryTarget, [marketId]);\n const queryResult = await suiKit.inspectTxn(txBlock);\n const marketData = queryResult.events[0].parsedJson as MarketDataInterface;\n\n const assets: AssetPoolInterface[] = [];\n const collaterals: CollateralPoolInterface[] = [];\n\n for (const asset of marketData.pools) {\n // parse origin data\n const coinType = '0x' + asset.type.name;\n const borrowAPYFactor = 24 * 365 * 3600;\n const baseBorrowRate = Number(asset.baseBorrowRatePerSec.value) / 2 ** 32;\n const borrowRateOnHighKink =\n Number(asset.borrowRateOnHighKink.value) / 2 ** 32;\n const borrowRateOnMidKink =\n Number(asset.borrowRateOnMidKink.value) / 2 ** 32;\n const maxBorrowRate = Number(asset.maxBorrowRate.value) / 2 ** 32;\n const highKink = Number(asset.highKink.value) / 2 ** 32;\n const midKink = Number(asset.midKink.value) / 2 ** 32;\n const borrowRate = Number(asset.interestRate.value) / 2 ** 32;\n const borrowRateScale = Number(asset.interestRateScale);\n const borrowIndex = Number(asset.borrowIndex);\n const lastUpdated = Number(asset.lastUpdated);\n const cash = Number(asset.cash);\n const debt = Number(asset.debt);\n const marketCoinSupply = Number(asset.marketCoinSupply);\n const minBorrowAmount = Number(asset.minBorrowAmount);\n const reserve = Number(asset.reserve);\n const reserveFactor = Number(asset.reserveFactor.value) / 2 ** 32;\n const borrowWeight = Number(asset.borrowWeight.value) / 2 ** 32;\n\n // calculated data\n const caculatedBaseBorrowRate = BigNumber(baseBorrowRate)\n .multipliedBy(borrowAPYFactor)\n .dividedBy(borrowRateScale)\n .toNumber();\n const caculatedBorrowRateOnHighKink = BigNumber(borrowRateOnHighKink)\n .multipliedBy(borrowAPYFactor)\n .dividedBy(borrowRateScale)\n .toNumber();\n const caculatedBorrowRateOnMidKink = BigNumber(borrowRateOnMidKink)\n .multipliedBy(borrowAPYFactor)\n .dividedBy(borrowRateScale)\n .toNumber();\n const caculatedMaxBorrowRate = BigNumber(maxBorrowRate)\n .multipliedBy(borrowAPYFactor)\n .dividedBy(borrowRateScale)\n .toNumber();\n const caculatedBorrowRate = BigNumber(borrowRate)\n .multipliedBy(borrowAPYFactor)\n .dividedBy(borrowRateScale)\n .toNumber();\n const timeDelta = Math.floor(new Date().getTime() / 1000) - lastUpdated;\n const borrowIndexDelta = BigNumber(borrowIndex)\n .multipliedBy(BigNumber(timeDelta).multipliedBy(borrowRate))\n .dividedBy(borrowRateScale);\n const currentBorrowIndex = BigNumber(borrowIndex).plus(borrowIndexDelta);\n // how much accumulated interest since `lastUpdate`\n const growthInterest = BigNumber(currentBorrowIndex)\n .dividedBy(borrowIndex)\n .minus(1);\n const increasedDebt = BigNumber(debt).multipliedBy(growthInterest);\n const currentTotalDebt = increasedDebt.plus(debt);\n const currentTotalReserve = BigNumber(reserve).plus(\n increasedDebt.multipliedBy(reserveFactor)\n );\n const currentTotalSupply = BigNumber(currentTotalDebt).plus(\n Math.max(cash - currentTotalReserve.toNumber(), 0)\n );\n let utilizationRate =\n BigNumber(currentTotalDebt).dividedBy(currentTotalSupply);\n utilizationRate = utilizationRate.isFinite()\n ? utilizationRate\n : BigNumber(0);\n let supplyRate = BigNumber(caculatedBorrowRate)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - reserveFactor);\n supplyRate = supplyRate.isFinite() ? supplyRate : BigNumber(0);\n\n // base data\n const coin = scallopUtils.getCoinNameFromCoinType(\n coinType\n ) as SupportCollateralCoins;\n const symbol = coin.toUpperCase() as Uppercase<SupportAssetCoins>;\n const marketCoinType = scallopUtils.parseMarketCoinType(\n scallopAddress.get(`core.coins.${coin}.id`),\n scallopAddress.get('core.packages.protocol.id'),\n coin\n );\n const wrappedType =\n coin === 'usdc' || coin === 'usdt' || coin === 'eth'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n\n assets.push({\n coin: coin,\n symbol: symbol,\n coinType: coinType,\n wrappedType: wrappedType,\n marketCoinType: marketCoinType,\n calculated: {\n utilizationRate: utilizationRate.toNumber(),\n baseBorrowRate: caculatedBaseBorrowRate,\n borrowInterestRate: Math.min(\n caculatedBorrowRate,\n caculatedMaxBorrowRate\n ),\n supplyInterestRate: supplyRate.toNumber(),\n currentGrowthInterest: growthInterest.toNumber(),\n currentBorrowIndex: currentBorrowIndex.toNumber(),\n currentTotalSupply: currentTotalSupply.toNumber(),\n currentTotalDebt: currentTotalDebt.toNumber(),\n currentTotalReserve: currentTotalReserve.toNumber(),\n },\n origin: {\n highKink,\n midKink,\n baseBorrowRate: caculatedBaseBorrowRate,\n borrowRateOnHighKink: caculatedBorrowRateOnHighKink,\n borrowRateOnMidKink: caculatedBorrowRateOnMidKink,\n borrowRate: caculatedBorrowRate,\n maxBorrowRate: caculatedMaxBorrowRate,\n reserveFactor,\n borrowWeight,\n borrowIndex,\n lastUpdated,\n debt,\n cash,\n marketCoinSupply,\n minBorrowAmount,\n reserve,\n },\n });\n }\n\n for (const collateral of marketData.collaterals) {\n // parse origin data\n const coinType = '0x' + collateral.type.name;\n const collateralFactor =\n Number(collateral.collateralFactor.value) / 2 ** 32;\n const liquidationFactor =\n Number(collateral.liquidationFactor.value) / 2 ** 32;\n const liquidationDiscount =\n Number(collateral.liquidationDiscount.value) / 2 ** 32;\n const liquidationPanelty =\n Number(collateral.liquidationPanelty.value) / 2 ** 32;\n const liquidationReserveFactor =\n Number(collateral.liquidationReserveFactor.value) / 2 ** 32;\n const maxCollateralAmount = Number(collateral.maxCollateralAmount);\n const totalCollateralAmount = Number(collateral.totalCollateralAmount);\n\n // base data\n const coin = scallopUtils.getCoinNameFromCoinType(\n coinType\n ) as SupportCollateralCoins;\n const symbol = coin.toUpperCase() as Uppercase<SupportCollateralCoins>;\n const wrappedType =\n coin === 'usdc' || coin === 'usdt' || coin === 'eth'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n\n collaterals.push({\n coin: coin,\n symbol: symbol,\n coinType: coinType,\n wrappedType: wrappedType,\n origin: {\n collateralFactor,\n liquidationFactor,\n liquidationDiscount,\n liquidationPanelty,\n liquidationReserveFactor,\n maxCollateralAmount,\n totalCollateralAmount,\n },\n });\n }\n\n return {\n assets: assets,\n collaterals: collaterals,\n data: marketData,\n } as MarketInterface;\n};\n","import { SuiKit, SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from '../models';\nimport { ObligationInterface } from '../types';\n\nexport const queryObligation = async (\n obligationId: string,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit\n) => {\n const packageId = scallopAddress.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data`;\n const txBlock = new SuiTxBlock();\n txBlock.moveCall(queryTarget, [obligationId]);\n const queryResult = await suiKit.inspectTxn(txBlock);\n return queryResult.events[0].parsedJson as ObligationInterface;\n};\n\nexport const getObligations = async (\n ownerAddress: string,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit\n) => {\n const owner = ownerAddress || suiKit.currentAddress();\n const keyObjectRefs = await suiKit.provider().getOwnedObjects({\n owner,\n filter: {\n StructType: `${scallopAddress.get(\n 'core.packages.protocol.id'\n )}::obligation::ObligationKey`,\n },\n });\n const keyIds = keyObjectRefs.data\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined) as string[];\n const keyObjects = await suiKit.getObjects(keyIds);\n const obligations: { id: string; keyId: string }[] = [];\n for (const keyObject of keyObjects) {\n const keyId = keyObject.objectId;\n const fields = keyObject.objectFields as any;\n const obligationId = fields['ownership']['fields']['of'];\n obligations.push({ id: obligationId, keyId });\n }\n return obligations;\n};\n","import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js';\nimport { SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport type {\n ScallopNormalMethodsHandler,\n SuiTxBlockWithNormalScallopMethods,\n CoreIds,\n} from '../types';\n\nconst scallopNormalMethodsHandler: ScallopNormalMethodsHandler = {\n openObligation:\n ({ txBlock, coreIds }) =>\n () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n [coreIds.version]\n ),\n returnObligation:\n ({ txBlock, coreIds }) =>\n (obligation, obligationHotPotato) =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n [coreIds.version, obligation, obligationHotPotato]\n ),\n openObligationEntry:\n ({ txBlock, coreIds }) =>\n () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n [coreIds.version]\n ),\n addCollateral:\n ({ txBlock, coreIds, scallopUtils, scallopAddress }) =>\n (obligation, coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n [coreIds.version, obligation, coreIds.market, coin],\n [coinType]\n );\n },\n takeCollateral:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n deposit:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (marketCoin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (marketCoin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowEntry:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow_entry`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n repay:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n [coreIds.version, coreIds.market, amount],\n [coinType]\n );\n },\n repayFlashLoan:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, loan, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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\nexport const newTxBlock = (\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils\n) => {\n const coreIds: CoreIds = {\n protocolPkg: scallopAddress.get('core.packages.protocol.id'),\n market: scallopAddress.get('core.market'),\n version: scallopAddress.get('core.version'),\n dmlR: scallopAddress.get('core.coinDecimalsRegistry'),\n oracle: scallopAddress.get('core.oracles.xOracle'),\n };\n const txBlock = new SuiTxBlock();\n const txBlockProxy = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in scallopNormalMethodsHandler) {\n return scallopNormalMethodsHandler[\n prop as keyof ScallopNormalMethodsHandler\n ]({\n txBlock: target,\n coreIds,\n scallopAddress,\n scallopUtils,\n });\n }\n return target[prop as keyof SuiTxBlock];\n },\n });\n return txBlockProxy as SuiTxBlockWithNormalScallopMethods;\n};\n","import { fromB64 } from '@mysten/bcs';\nimport { SUI_CLOCK_OBJECT_ID, TransactionArgument } from '@mysten/sui.js';\nimport { SuiTxBlock, SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { SupportCoins, SupportAssetCoins, SupportOracleType } from '../types';\nimport { queryObligation } from '../queries';\n\nexport const updateOraclesForWithdrawCollateral = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n obligationCoinNames,\n isTestnet\n );\n};\n\nexport const updateOraclesForLiquidation = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n obligationCoinNames,\n isTestnet\n );\n};\n\nexport const updateOraclesForBorrow = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n borrowCoinName: SupportAssetCoins,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n const updateCoinNames = [\n ...new Set([...obligationCoinNames, borrowCoinName]),\n ];\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n updateCoinNames,\n isTestnet\n );\n};\n\nconst getObligationCoinNames = async (\n suiKit: SuiKit,\n obligationId: string,\n address: ScallopAddress,\n scallopUtils: ScallopUtils\n) => {\n const obligation = await queryObligation(obligationId, address, suiKit);\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 scallopUtils.getCoinNameFromCoinType(coinType);\n });\n return obligationCoinNames;\n};\n\nexport const updateOracles = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinNames: SupportCoins[],\n isTestnet: boolean\n) => {\n const updateCoinTypes = [...new Set(coinNames)];\n for (const coinName of updateCoinTypes) {\n await updateOracle(txBlock, address, scallopUtils, coinName, isTestnet);\n }\n};\n\nconst updateOracle = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n isTestnet: boolean\n) => {\n const coinPackageId = address.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n const [vaaFromFeeId] = await scallopUtils.getVaas(\n [address.get(`core.coins.${coinName}.oracle.pyth.feed`)],\n isTestnet\n );\n\n updatePrice(\n txBlock,\n isTestnet ? ['pyth'] : ['pyth'],\n address.get('core.packages.xOracle.id'),\n address.get('core.oracles.xOracle'),\n address.get('core.packages.pyth.id'),\n address.get('core.oracles.pyth.registry'),\n address.get('core.oracles.pyth.state'),\n address.get('core.oracles.pyth.wormholeState'),\n address.get(`core.coins.${coinName}.oracle.pyth.feedObject`),\n vaaFromFeeId,\n address.get('core.packages.switchboard.id'),\n address.get('core.oracles.switchboard.registry'),\n address.get(`core.coins.${coinName}.oracle.switchboard`),\n address.get('core.packages.supra.id'),\n address.get('core.oracles.supra.registry'),\n 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 pythWormholeStateId - The whormhole state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param pythVaaFromFeeId - The vaa from pyth api with feed id.\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 * @returns Sui-Kit type transaction block.\n */\nfunction updatePrice(\n txBlock: SuiTxBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythWormholeStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n pythVaaFromFeeId: 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 pythWormholeStateId,\n pythFeedObjectId,\n pythVaaFromFeeId,\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 * @returns Sui-Kit type transaction block.\n */\nfunction priceUpdateRequest(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction confirmPriceUpdateRequest(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updateSupraPrice(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updateSwitchboardPrice(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updatePythPrice(\n txBlock: SuiTxBlock,\n packageId: string,\n request: TransactionArgument,\n stateId: TransactionArgument | string,\n wormholeStateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n vaaFromFeeId: string,\n registryId: TransactionArgument | string,\n coinType: string\n) {\n const [updateFee] = txBlock.splitSUIFromGas([1]);\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [\n request,\n wormholeStateId,\n stateId,\n feedObjectId,\n registryId,\n txBlock.pure([...fromB64(vaaFromFeeId)]),\n updateFee,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n}\n","import { SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { SupportCoins } from '../types';\n\nexport const selectCoin = async (\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n amount: number,\n sender: string\n) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n const coins = await scallopUtils.selectCoins(sender, amount, coinType);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n};\n\nexport const selectMarketCoin = async (\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n amount: number,\n sender: string\n) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const protocolPackageId = scallopAddress.get('core.packages.protocol.id');\n const coinType = scallopUtils.parseMarketCoinType(\n coinPackageId,\n protocolPackageId,\n coinName\n );\n const coins = await scallopUtils.selectCoins(sender, amount, coinType);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n};\n","/**\n * This file contains the complex transaction builder, which contains multiple calls in a single transaction.\n */\nimport { SuiTxBlock, SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { getObligations } from '../queries';\nimport { newTxBlock } from './normalMethods';\nimport {\n updateOraclesForBorrow,\n updateOraclesForWithdrawCollateral,\n updateOracles,\n} from './oracle';\nimport { selectCoin, selectMarketCoin } from './coin';\nimport type { SuiTxArg } from '@scallop-io/sui-kit';\nimport type { ScallopQuickMethodsHandler, ScallopTxBlock } from '../types';\n\nconst requireSender = (txBlock: SuiTxBlock) => {\n const sender = txBlock.blockData.sender;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n\nconst requireObligationInfo = async (\n ...args: [\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit,\n obligationId?: SuiTxArg | undefined,\n obligationKey?: SuiTxArg | undefined,\n ]\n) => {\n const [txBlock, scallopAddress, suiKit, obligationId, obligationKey] = args;\n if (args.length === 4 && obligationId) return { obligationId };\n if (args.length === 5 && obligationId && obligationKey)\n return { obligationId, obligationKey };\n const sender = requireSender(txBlock);\n const obligations = await getObligations(sender, scallopAddress, suiKit);\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\nconst scallopQuickMethodsHandler: ScallopQuickMethodsHandler = {\n addCollateralQuick:\n ({ txBlock, scallopAddress, scallopUtils, suiKit }) =>\n async (amount, coinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId\n );\n\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n txBlock.addCollateral(obligationArg, suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.addCollateral(obligationArg, takeCoin, coinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress, isTestnet }) =>\n async (amount, coinName, obligationId, obligationKey) => {\n const { obligationId: obligationArg, obligationKey: obligationKeyArg } =\n await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId,\n obligationKey\n );\n\n await updateOraclesForWithdrawCollateral(\n txBlock,\n scallopAddress,\n scallopUtils,\n suiKit,\n obligationArg as string,\n isTestnet\n );\n return txBlock.takeCollateral(\n obligationArg,\n obligationKeyArg as SuiTxArg,\n amount,\n coinName\n );\n },\n depositQuick:\n ({ txBlock, scallopUtils, scallopAddress }) =>\n async (amount, coinName) => {\n const sender = requireSender(txBlock);\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.deposit(suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.deposit(takeCoin, coinName);\n }\n },\n withdrawQuick:\n ({ txBlock, scallopUtils, scallopAddress }) =>\n async (amount, coinName) => {\n const sender = requireSender(txBlock);\n const { leftCoin, takeCoin } = await selectMarketCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.withdraw(takeCoin, coinName);\n },\n borrowQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress, isTestnet }) =>\n async (amount, coinName, obligationId, obligationKey) => {\n const { obligationId: obligationArg, obligationKey: obligationKeyArg } =\n await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId,\n obligationKey\n );\n\n await updateOraclesForBorrow(\n txBlock,\n scallopAddress,\n scallopUtils,\n suiKit,\n obligationArg as string,\n coinName,\n isTestnet\n );\n return txBlock.borrow(\n obligationArg,\n obligationKeyArg as SuiTxArg,\n amount,\n coinName\n );\n },\n repayQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress }) =>\n async (amount, coinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId\n );\n\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.repay(obligationArg, suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.repay(obligationArg, takeCoin, coinName);\n }\n },\n updateAssetPricesQuick:\n ({ txBlock, scallopUtils, scallopAddress, isTestnet }) =>\n async (coinNames) => {\n return updateOracles(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinNames,\n isTestnet\n );\n },\n};\n\nexport const newScallopTxBlock = (\n suiKit: SuiKit,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n isTestnet: boolean\n) => {\n const txBlock = newTxBlock(scallopAddress, scallopUtils);\n const txBlockProxy = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in scallopQuickMethodsHandler) {\n return scallopQuickMethodsHandler[\n prop as keyof ScallopQuickMethodsHandler\n ]({\n txBlock: target,\n suiKit,\n scallopAddress,\n scallopUtils,\n isTestnet,\n });\n }\n return target[prop as keyof SuiTxBlock];\n },\n });\n return txBlockProxy as ScallopTxBlock;\n};\n"],"mappings":"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","names":["import_sui_kit","axios","network","addresses","import_sui","import_sui_kit","import_sui_kit","BigNumber","import_sui_kit","import_sui","import_sui_kit","import_sui"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants/common.ts","../src/models/scallop.ts","../src/models/scallopAddress.ts","../src/models/scallopClient.ts","../src/models/scallopUtils.ts","../src/queries/market.ts","../src/queries/obligation.ts","../src/txBuilders/normalMethods.ts","../src/txBuilders/oracle.ts","../src/txBuilders/coin.ts","../src/txBuilders/quickMethods.ts"],"sourcesContent":["export * from './constants';\nexport * from './models';\nexport * from './types';\n","export const API_BASE_URL = 'https://sui.api.scallop.io';\n\nexport const ADDRESSES_ID = '6462a088a7ace142bb6d7e9b';\n\nexport const SUPPORT_ASSET_COINS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n] as const;\nexport const SUPPORT_COLLATERAL_COINS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n] as const;\n\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 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n\nexport const SUI_COIN_TYPE_ARG_REGEX = /^0x(0*)2::sui::SUI$/;\n","import { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopClient } from './scallopClient';\nimport { ScallopUtils } from './scallopUtils';\nimport { newScallopTxBlock } from '../txBuilders';\nimport { ADDRESSES_ID } from '../constants';\nimport type { NetworkType } from '@scallop-io/sui-kit';\nimport type { ScallopParams, ScallopTxBlock } from '../types';\n\n/**\n * ### Scallop\n *\n * The main instance that controls interaction with the Scallop contract.\n *\n * #### Usage\n *\n * ```typescript\n * const sdk = new Scallop(<parameters>);\n * ```\n */\nexport class Scallop {\n public params: ScallopParams;\n public suiKit: SuiKit;\n public 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 * Create an instance to operate the transaction block, making it more convenient to organize transaction combinations.\n * @return Scallop Transaction Builder\n */\n public async createTxBuilder() {\n await this.address.read();\n const scallopUtils = new ScallopUtils(this.params);\n const suiKit = new SuiKit(this.params);\n const isTestnet = this.params.networkType === 'testnet';\n return {\n createTxBlock: () => {\n return newScallopTxBlock(suiKit, this.address, scallopUtils, isTestnet);\n },\n signAndSendTxBlock: (txBlock: ScallopTxBlock) => {\n return suiKit.signAndSendTxn(txBlock);\n },\n };\n }\n\n /**\n * Create an instance to collect the addresses, making it easier to get object addresses from lending contract.\n *\n * @param id - The API id of the addresses.\n * @param auth - The authentication API key.\n * @param network - Specifies which network's addresses you want to set.\n * @return Scallop Address\n */\n public createAddress(id: string, auth: string, network: NetworkType) {\n return new ScallopAddress({ id, auth, network });\n }\n\n /**\n * Create an instance that provides contract interaction operations for general users.\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 await this.address.read();\n return new ScallopClient(this.params, this.address, walletAddress);\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\n/**\n * it provides methods for managing addresses.\n */\nexport class ScallopAddress {\n private _apiClient: AxiosInstance;\n private _id?: string;\n private readonly _auth?: string;\n private readonly _network: NetworkType;\n private _addresses?: 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._apiClient = 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 * @returns The addresses API id.\n */\n public getId() {\n return this._id;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @returns The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._addresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object'\n ? nestedAddressObj[key]\n : nestedAddressObj,\n this._addresses\n );\n return value || undefined;\n } else {\n return undefined;\n }\n }\n\n /**\n * Set the address at the provided path.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @returns The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._addresses) {\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._addresses);\n }\n return this._addresses;\n }\n\n /**\n * Get the addresses.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @returns The addresses.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n } else {\n return this._addresses;\n }\n }\n\n /**\n * Set the addresses into addresses map.\n *\n * @param network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @returns The addresses.\n */\n public setAddresses(network?: NetworkType, addresses?: AddressesInterface) {\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (targetAddresses) {\n this._addressesMap.set(targetNetwork, targetAddresses);\n } else {\n // TODO: change to new format version\n this._addressesMap.set(targetNetwork, {\n core: {\n version: '',\n versionCap: '',\n market: '',\n adminCap: '',\n coinDecimalsRegistry: '',\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 },\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 // Deploy by pyth on testnet\n pyth: {\n id: '',\n upgradeCap: '',\n },\n // Deploy by ourself on testnet\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 });\n }\n }\n\n /**\n * Get all addresses.\n *\n * @returns All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n /**\n * Create a new address through the API and synchronize it back to the\n * instance. If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` is provided, an addresses with all empty strings is created\n * 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 network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @param auth - The authentication API key.\n * @returns The addresses.\n */\n public async create(\n network?: NetworkType,\n addresses?: AddressesInterface,\n auth?: string\n ) {\n const apiKey = auth || this._auth || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (apiKey !== undefined) {\n this._addressesMap.clear();\n this.setAddresses(targetNetwork, targetAddresses);\n const response = await this._apiClient.post(\n `${API_BASE_URL}/addresses`,\n JSON.stringify(Object.fromEntries(this._addressesMap)),\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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\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 * It doesn't read the data stored in the address instance, but reads and\n * synchronizes the data from the API into instance.\n *\n * @param id - The id of the addresses to get.\n * @returns The 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._apiClient.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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\n } else {\n throw Error('Failed to create addresses.');\n }\n }\n }\n\n /**\n * Update the address through the API and synchronize it back to the\n * instance. If the `network` is not specified, the mainnet is used by default.\n * If no `addresses` is provided, an addresses with all empty strings is created\n * 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 id - The id of the addresses to update.\n * @param network - Specifies which network's addresses you want to set.\n * @param addresses - The addresses be setted to the tartget network.\n * @param auth - The authentication api key.\n * @returns The addresses.\n */\n public async update(\n id?: string,\n network?: NetworkType,\n addresses?: AddressesInterface,\n auth?: string\n ) {\n const apiKey = auth || this._auth || undefined;\n const targetId = id || this._id || undefined;\n const targetNetwork = network || this._network;\n const targetAddresses = addresses || this._addresses || undefined;\n if (targetId === undefined) throw Error('Require addresses id.');\n if (apiKey !== undefined) {\n if (id !== this._id) {\n this._addressesMap.clear();\n }\n this.setAddresses(targetNetwork, targetAddresses);\n const response = await this._apiClient.put(\n `${API_BASE_URL}/addresses/${targetId}`,\n JSON.stringify(Object.fromEntries(this._addressesMap)),\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._addresses = addresses;\n this._addressesMap.set(network as NetworkType, addresses);\n }\n }\n this._id = response.data.id;\n return this._addresses;\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 synchronizes\n * them back to 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 if (targetId === undefined) throw Error('Require addresses id.');\n if (apiKey !== undefined) {\n const response = await this._apiClient.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._addresses = 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';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { newScallopTxBlock } from '../txBuilders';\nimport { queryObligation, queryMarket, getObligations } from '../queries';\nimport type {\n TransactionArgument,\n SuiTransactionBlockResponse,\n} from '@mysten/sui.js';\nimport type { SuiTxArg } from '@scallop-io/sui-kit';\nimport type {\n ScallopClientFnReturnType,\n ScallopParams,\n SupportAssetCoins,\n SupportCollateralCoins,\n SupportCoins,\n ScallopTxBlock,\n} from '../types';\n\n/**\n * ### Scallop Client\n *\n * it provides contract interaction operations for general users.\n *\n * #### Usage\n *\n * ```typescript\n * const client = new Scallop(<parameters>);\n * client.<interact functions>();\n * ```\n */\nexport class ScallopClient {\n public suiKit: SuiKit;\n public address: ScallopAddress;\n public walletAddress: string;\n\n private readonly _utils: ScallopUtils;\n private readonly _isTestnet: boolean;\n\n public constructor(\n params: ScallopParams,\n address: ScallopAddress,\n walletAddress?: string,\n isTestnet?: boolean\n ) {\n this.suiKit = new SuiKit(params);\n this.address = address;\n this.walletAddress = normalizeSuiAddress(\n walletAddress || this.suiKit.currentAddress()\n );\n this._utils = new ScallopUtils(params);\n this._isTestnet =\n isTestnet ||\n (params.networkType ? params.networkType === 'testnet' : false);\n }\n\n createTxBlock() {\n return newScallopTxBlock(\n this.suiKit,\n this.address,\n this._utils,\n this._isTestnet\n );\n }\n\n /**\n * Query market data.\n *\n * @param rateType - How interest rates are calculated.\n * @return Market data\n */\n public async queryMarket(rateType: 'apy' | 'apr' = 'apr') {\n return queryMarket(this.address, this.suiKit, this._utils, rateType);\n }\n\n /**\n * Query obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data\n */\n async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return getObligations(owner, this.address, this.suiKit);\n }\n\n /**\n * Query obligation data.\n *\n * @param obligationId - The obligation id from protocol package.\n * @return Obligation data\n */\n public async queryObligation(obligationId: string) {\n return queryObligation(obligationId, this.address, this.suiKit);\n }\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.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 coinName - 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 coinName: SupportCollateralCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async depositCollateral<S extends boolean>(\n coinName: SupportCollateralCoins,\n amount: number,\n sign?: S,\n obligationId?: SuiTxArg,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async depositCollateral<S extends boolean>(\n coinName: SupportCollateralCoins,\n amount: number,\n sign: S = true as S,\n obligationId?: SuiTxArg,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n if (obligationId) {\n await txBlock.addCollateralQuick(amount, coinName, obligationId);\n } else {\n const [obligation, obligationKey, hotPotato] = txBlock.openObligation();\n await txBlock.addCollateralQuick(amount, coinName, 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 coinName - 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 coinName: 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.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await txBlock.takeCollateralQuick(\n amount,\n coinName,\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 coinName - Types of asset 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 coinName: SupportAssetCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async deposit<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async deposit<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await txBlock.depositQuick(amount, coinName);\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 * Withdraw asset from the specific pool, must return market coin.\n *\n * @param coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async withdraw<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign?: S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async withdraw<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.withdrawQuick(amount, coinName);\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 coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\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.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const coin = await txBlock.borrowQuick(\n amount,\n coinName,\n obligationId,\n obligationKey\n );\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 * Repay asset into the specific pool.\n *\n * @param coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number,\n sign: S = true as S,\n obligationId: string,\n walletAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await txBlock.repayQuick(amount, coinName, obligationId);\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 coinName - Types of asset coin.\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 coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument\n ): Promise<SuiTransactionBlockResponse>;\n public async flashLoan<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument,\n sign?: S\n ): Promise<ScallopClientFnReturnType<S>>;\n public async flashLoan<S extends boolean>(\n coinName: SupportAssetCoins,\n amount: number,\n callback: (\n txBlock: ScallopTxBlock,\n coin: TransactionArgument\n ) => TransactionArgument,\n sign: S = true as S\n ): Promise<ScallopClientFnReturnType<S>> {\n const txBlock = this.createTxBlock();\n const [coin, loan] = txBlock.borrowFlashLoan(amount, coinName);\n txBlock.repayFlashLoan(callback(txBlock, coin), loan, coinName);\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 * Mint and get test coin.\n *\n * @remarks\n * Only be used on the test network.\n *\n * @param coinName - Types of coins supported on the test network.\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 coinName: Exclude<SupportCoins, 'sui'>,\n amount: number\n ): Promise<SuiTransactionBlockResponse>;\n public async mintTestCoin<S extends boolean>(\n coinName: Exclude<SupportCoins, 'sui'>,\n amount: number,\n sign?: S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>>;\n public async mintTestCoin<S extends boolean>(\n coinName: Exclude<SupportCoins, 'sui'>,\n amount: number,\n sign: S = true as S,\n receiveAddress?: string\n ): Promise<ScallopClientFnReturnType<S>> {\n if (!this._isTestnet) {\n throw new Error('Only be used on the test network.');\n }\n\n const txBlock = this.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.${coinName}.treasury`);\n const target = `${packageId}::${coinName}::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 {\n SUI_FRAMEWORK_ADDRESS,\n SUI_TYPE_ARG,\n normalizeStructTag,\n} from '@mysten/sui.js';\nimport { SuiKit } from '@scallop-io/sui-kit';\nimport { PriceServiceConnection } from '@pythnetwork/price-service-client';\nimport type { ScallopParams, SupportCoins } from '../types';\n\n/**\n * ### Scallop Utils\n *\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * #### Usage\n *\n * ```typescript\n * const utils = new ScallopUtils(<parameters>);\n * utils.<help functions>();\n * ```\n */\nexport class ScallopUtils {\n private _suiKit: SuiKit;\n\n public constructor(params: ScallopParams) {\n this._suiKit = new SuiKit(params);\n }\n\n /**\n * @description Select coin id that add up to the given amount as transaction arguments.\n * @param owner The address of the owner.\n * @param amount The amount that is needed for the coin.\n * @param coinType The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoins(\n owner: string,\n amount: number,\n coinType: string = SUI_TYPE_ARG\n ) {\n const coins = await this._suiKit.suiInteractor.selectCoins(\n owner,\n amount,\n coinType\n );\n return coins.map((c) => c.objectId);\n }\n\n /**\n * @description Fetch price feed VAAs of interest from the Pyth.\n * @param priceIds Array of hex-encoded price ids.\n * @param isTestnet Specify whether it is a test network.\n * @return Array of base64 encoded VAAs.\n */\n public async getVaas(priceIds: string[], isTestnet?: boolean) {\n const connection = new PriceServiceConnection(\n isTestnet\n ? 'https://xc-testnet.pyth.network'\n : 'https://xc-mainnet.pyth.network',\n {\n priceFeedRequestConfig: {\n binary: true,\n },\n }\n );\n return await connection.getLatestVaas(priceIds);\n }\n\n /**\n * @description Handle non-standard coins.\n * @param coinPackageId Package id of coin.\n * @param coinName specific support coin name.\n * @return coinType.\n */\n public parseCoinType(coinPackageId: string, coinName: string) {\n if (coinName === 'sui') return normalizeStructTag(SUI_TYPE_ARG);\n const wormHoleCoins = [\n // USDC\n '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n // USDT\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n // ETH\n '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n ];\n if (wormHoleCoins.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n } else {\n return `${coinPackageId}::${coinName}::${coinName.toUpperCase()}`;\n }\n }\n\n /**\n * @description Handle non-standard coin names.\n * @param coinPackageId Package id of coin.\n * @param coinName specific support coin name.\n * @return coinType.\n */\n public getCoinNameFromCoinType(coinType: string) {\n const wormHoleCoinTypes = [\n // USDC\n '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n // USDT\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n // ETH\n '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n ];\n\n if (coinType === wormHoleCoinTypes[0]) {\n return 'usdc';\n } else if (coinType === wormHoleCoinTypes[1]) {\n return 'usdt';\n } else if (coinType === wormHoleCoinTypes[2]) {\n return 'eth';\n } else {\n return coinType.split('::')[2].toLowerCase() as SupportCoins;\n }\n }\n\n /**\n * @description Handle market coin types.\n *\n * @param coinPackageId Package id of coin.\n * @param protocolPkgId Package id of protocol.\n * @param coinName specific support coin name.\n *\n * @return marketCoinType.\n */\n public parseMarketCoinType(\n coinPackageId: string,\n protocolPkgId: string,\n coinName: string\n ) {\n const coinType = this.parseCoinType(\n coinName === 'sui' ? SUI_FRAMEWORK_ADDRESS : coinPackageId,\n coinName\n );\n return `${protocolPkgId}::reserve::MarketCoin<${coinType}>`;\n }\n}\n","import { SuiKit, SuiTxBlock } from '@scallop-io/sui-kit';\nimport BigNumber from 'bignumber.js';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport {\n MarketInterface,\n MarketDataInterface,\n AssetPoolInterface,\n CollateralPoolInterface,\n SupportCollateralCoins,\n SupportAssetCoins,\n} from '../types';\n\nexport const queryMarket = async (\n scallopAddress: ScallopAddress,\n suiKit: SuiKit,\n scallopUtils: ScallopUtils,\n rateType: 'apy' | 'apr'\n) => {\n const packageId = scallopAddress.get('core.packages.query.id');\n const marketId = scallopAddress.get('core.market');\n const txBlock = new SuiTxBlock();\n const queryTarget = `${packageId}::market_query::market_data`;\n txBlock.moveCall(queryTarget, [marketId]);\n const queryResult = await suiKit.inspectTxn(txBlock);\n const marketData = queryResult.events[0].parsedJson as MarketDataInterface;\n\n const assets: AssetPoolInterface[] = [];\n const collaterals: CollateralPoolInterface[] = [];\n\n for (const asset of marketData.pools) {\n // parse origin data\n const coinType = '0x' + asset.type.name;\n const borrowYearFactor = 24 * 365 * 3600;\n const baseBorrowRate = Number(asset.baseBorrowRatePerSec.value) / 2 ** 32;\n const borrowRateOnHighKink =\n Number(asset.borrowRateOnHighKink.value) / 2 ** 32;\n const borrowRateOnMidKink =\n Number(asset.borrowRateOnMidKink.value) / 2 ** 32;\n const maxBorrowRate = Number(asset.maxBorrowRate.value) / 2 ** 32;\n const highKink = Number(asset.highKink.value) / 2 ** 32;\n const midKink = Number(asset.midKink.value) / 2 ** 32;\n const borrowRate = Number(asset.interestRate.value) / 2 ** 32;\n const borrowRateScale = Number(asset.interestRateScale);\n const borrowIndex = Number(asset.borrowIndex);\n const lastUpdated = Number(asset.lastUpdated);\n const cash = Number(asset.cash);\n const debt = Number(asset.debt);\n const marketCoinSupply = Number(asset.marketCoinSupply);\n const minBorrowAmount = Number(asset.minBorrowAmount);\n const reserve = Number(asset.reserve);\n const reserveFactor = Number(asset.reserveFactor.value) / 2 ** 32;\n const borrowWeight = Number(asset.borrowWeight.value) / 2 ** 32;\n\n // calculated data\n const calculatedBaseBorrowRate =\n rateType === 'apr'\n ? (baseBorrowRate * borrowYearFactor) / borrowRateScale\n : (1 + baseBorrowRate / borrowRateScale) ** borrowYearFactor - 1;\n const calculatedBorrowRateOnHighKink =\n rateType === 'apr'\n ? (borrowRateOnHighKink * borrowYearFactor) / borrowRateScale\n : (1 + borrowRateOnHighKink / borrowRateScale) ** borrowYearFactor - 1;\n const calculatedBorrowRateOnMidKink =\n rateType === 'apr'\n ? (borrowRateOnMidKink * borrowYearFactor) / borrowRateScale\n : (1 + borrowRateOnMidKink / borrowRateScale) ** borrowYearFactor - 1;\n const calculatedMaxBorrowRate =\n rateType === 'apr'\n ? (maxBorrowRate * borrowYearFactor) / borrowRateScale\n : (1 + maxBorrowRate / borrowRateScale) ** borrowYearFactor - 1;\n const calculatedBorrowRate =\n rateType === 'apr'\n ? (borrowRate * borrowYearFactor) / borrowRateScale\n : (1 + borrowRate / borrowRateScale) ** borrowYearFactor - 1;\n\n const timeDelta = Math.floor(new Date().getTime() / 1000) - lastUpdated;\n const borrowIndexDelta = BigNumber(borrowIndex)\n .multipliedBy(BigNumber(timeDelta).multipliedBy(borrowRate))\n .dividedBy(borrowRateScale);\n const currentBorrowIndex = BigNumber(borrowIndex).plus(borrowIndexDelta);\n // how much accumulated interest since `lastUpdate`\n const growthInterest = BigNumber(currentBorrowIndex)\n .dividedBy(borrowIndex)\n .minus(1);\n const increasedDebt = BigNumber(debt).multipliedBy(growthInterest);\n const currentTotalDebt = increasedDebt.plus(debt);\n const currentTotalReserve = BigNumber(reserve).plus(\n increasedDebt.multipliedBy(reserveFactor)\n );\n const currentTotalSupply = BigNumber(currentTotalDebt).plus(\n Math.max(cash - currentTotalReserve.toNumber(), 0)\n );\n let utilizationRate =\n BigNumber(currentTotalDebt).dividedBy(currentTotalSupply);\n utilizationRate = utilizationRate.isFinite()\n ? utilizationRate\n : BigNumber(0);\n let supplyRate = BigNumber(calculatedBorrowRate)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - reserveFactor);\n supplyRate = supplyRate.isFinite() ? supplyRate : BigNumber(0);\n\n // base data\n const coin = scallopUtils.getCoinNameFromCoinType(\n coinType\n ) as SupportCollateralCoins;\n const symbol = coin.toUpperCase() as Uppercase<SupportAssetCoins>;\n const marketCoinType = scallopUtils.parseMarketCoinType(\n scallopAddress.get(`core.coins.${coin}.id`),\n scallopAddress.get('core.packages.protocol.id'),\n coin\n );\n const wrappedType =\n coin === 'usdc' || coin === 'usdt' || coin === 'eth'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n\n assets.push({\n coin: coin,\n symbol: symbol,\n coinType: coinType,\n wrappedType: wrappedType,\n marketCoinType: marketCoinType,\n calculated: {\n utilizationRate: utilizationRate.toNumber(),\n baseBorrowRate: calculatedBaseBorrowRate,\n borrowInterestRate: Math.min(\n calculatedBorrowRate,\n calculatedMaxBorrowRate\n ),\n supplyInterestRate: supplyRate.toNumber(),\n currentGrowthInterest: growthInterest.toNumber(),\n currentBorrowIndex: currentBorrowIndex.toNumber(),\n currentTotalSupply: currentTotalSupply.toNumber(),\n currentTotalDebt: currentTotalDebt.toNumber(),\n currentTotalReserve: currentTotalReserve.toNumber(),\n },\n origin: {\n highKink,\n midKink,\n baseBorrowRate: calculatedBaseBorrowRate,\n borrowRateOnHighKink: calculatedBorrowRateOnHighKink,\n borrowRateOnMidKink: calculatedBorrowRateOnMidKink,\n borrowRate: calculatedBorrowRate,\n maxBorrowRate: calculatedMaxBorrowRate,\n reserveFactor,\n borrowWeight,\n borrowIndex,\n lastUpdated,\n debt,\n cash,\n marketCoinSupply,\n minBorrowAmount,\n reserve,\n },\n });\n }\n\n for (const collateral of marketData.collaterals) {\n // parse origin data\n const coinType = '0x' + collateral.type.name;\n const collateralFactor =\n Number(collateral.collateralFactor.value) / 2 ** 32;\n const liquidationFactor =\n Number(collateral.liquidationFactor.value) / 2 ** 32;\n const liquidationDiscount =\n Number(collateral.liquidationDiscount.value) / 2 ** 32;\n const liquidationPanelty =\n Number(collateral.liquidationPanelty.value) / 2 ** 32;\n const liquidationReserveFactor =\n Number(collateral.liquidationReserveFactor.value) / 2 ** 32;\n const maxCollateralAmount = Number(collateral.maxCollateralAmount);\n const totalCollateralAmount = Number(collateral.totalCollateralAmount);\n\n // base data\n const coin = scallopUtils.getCoinNameFromCoinType(\n coinType\n ) as SupportCollateralCoins;\n const symbol = coin.toUpperCase() as Uppercase<SupportCollateralCoins>;\n const wrappedType =\n coin === 'usdc' || coin === 'usdt' || coin === 'eth'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n\n collaterals.push({\n coin: coin,\n symbol: symbol,\n coinType: coinType,\n wrappedType: wrappedType,\n origin: {\n collateralFactor,\n liquidationFactor,\n liquidationDiscount,\n liquidationPanelty,\n liquidationReserveFactor,\n maxCollateralAmount,\n totalCollateralAmount,\n },\n });\n }\n\n return {\n assets: assets,\n collaterals: collaterals,\n data: marketData,\n } as MarketInterface;\n};\n","import { SuiKit, SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress } from '../models';\nimport { ObligationInterface } from '../types';\n\nexport const queryObligation = async (\n obligationId: string,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit\n) => {\n const packageId = scallopAddress.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data`;\n const txBlock = new SuiTxBlock();\n txBlock.moveCall(queryTarget, [obligationId]);\n const queryResult = await suiKit.inspectTxn(txBlock);\n return queryResult.events[0].parsedJson as ObligationInterface;\n};\n\nexport const getObligations = async (\n ownerAddress: string,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit\n) => {\n const owner = ownerAddress || suiKit.currentAddress();\n const keyObjectRefs = await suiKit.provider().getOwnedObjects({\n owner,\n filter: {\n StructType: `${scallopAddress.get(\n 'core.packages.protocol.id'\n )}::obligation::ObligationKey`,\n },\n });\n const keyIds = keyObjectRefs.data\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined) as string[];\n const keyObjects = await suiKit.getObjects(keyIds);\n const obligations: { id: string; keyId: string }[] = [];\n for (const keyObject of keyObjects) {\n const keyId = keyObject.objectId;\n const fields = keyObject.objectFields as any;\n const obligationId = fields['ownership']['fields']['of'];\n obligations.push({ id: obligationId, keyId });\n }\n return obligations;\n};\n","import { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js';\nimport { SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport type {\n ScallopNormalMethodsHandler,\n SuiTxBlockWithNormalScallopMethods,\n CoreIds,\n} from '../types';\n\nconst scallopNormalMethodsHandler: ScallopNormalMethodsHandler = {\n openObligation:\n ({ txBlock, coreIds }) =>\n () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n [coreIds.version]\n ),\n returnObligation:\n ({ txBlock, coreIds }) =>\n (obligation, obligationHotPotato) =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n [coreIds.version, obligation, obligationHotPotato]\n ),\n openObligationEntry:\n ({ txBlock, coreIds }) =>\n () =>\n txBlock.moveCall(\n `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n [coreIds.version]\n ),\n addCollateral:\n ({ txBlock, coreIds, scallopUtils, scallopAddress }) =>\n (obligation, coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n [coreIds.version, obligation, coreIds.market, coin],\n [coinType]\n );\n },\n takeCollateral:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n deposit:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (marketCoin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (marketCoin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n borrowEntry:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, obligationKey, amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::borrow::borrow_entry`,\n [\n coreIds.version,\n obligation,\n obligationKey,\n coreIds.market,\n coreIds.dmlR,\n amount,\n coreIds.oracle,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n },\n repay:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (obligation, coin, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (amount, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n return txBlock.moveCall(\n `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n [coreIds.version, coreIds.market, amount],\n [coinType]\n );\n },\n repayFlashLoan:\n ({ txBlock, coreIds, scallopAddress, scallopUtils }) =>\n (coin, loan, coinName) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\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\nexport const newTxBlock = (\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils\n) => {\n const coreIds: CoreIds = {\n protocolPkg: scallopAddress.get('core.packages.protocol.id'),\n market: scallopAddress.get('core.market'),\n version: scallopAddress.get('core.version'),\n dmlR: scallopAddress.get('core.coinDecimalsRegistry'),\n oracle: scallopAddress.get('core.oracles.xOracle'),\n };\n const txBlock = new SuiTxBlock();\n const txBlockProxy = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in scallopNormalMethodsHandler) {\n return scallopNormalMethodsHandler[\n prop as keyof ScallopNormalMethodsHandler\n ]({\n txBlock: target,\n coreIds,\n scallopAddress,\n scallopUtils,\n });\n }\n return target[prop as keyof SuiTxBlock];\n },\n });\n return txBlockProxy as SuiTxBlockWithNormalScallopMethods;\n};\n","import { fromB64 } from '@mysten/bcs';\nimport { SUI_CLOCK_OBJECT_ID, TransactionArgument } from '@mysten/sui.js';\nimport { SuiTxBlock, SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { SupportCoins, SupportAssetCoins, SupportOracleType } from '../types';\nimport { queryObligation } from '../queries';\n\nexport const updateOraclesForWithdrawCollateral = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n obligationCoinNames,\n isTestnet\n );\n};\n\nexport const updateOraclesForLiquidation = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n obligationCoinNames,\n isTestnet\n );\n};\n\nexport const updateOraclesForBorrow = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n suiKit: SuiKit,\n obligationId: string,\n borrowCoinName: SupportAssetCoins,\n isTestnet: boolean\n) => {\n const obligationCoinNames = await getObligationCoinNames(\n suiKit,\n obligationId,\n address,\n scallopUtils\n );\n const updateCoinNames = [\n ...new Set([...obligationCoinNames, borrowCoinName]),\n ];\n return updateOracles(\n txBlock,\n address,\n scallopUtils,\n updateCoinNames,\n isTestnet\n );\n};\n\nconst getObligationCoinNames = async (\n suiKit: SuiKit,\n obligationId: string,\n address: ScallopAddress,\n scallopUtils: ScallopUtils\n) => {\n const obligation = await queryObligation(obligationId, address, suiKit);\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 scallopUtils.getCoinNameFromCoinType(coinType);\n });\n return obligationCoinNames;\n};\n\nexport const updateOracles = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinNames: SupportCoins[],\n isTestnet: boolean\n) => {\n const updateCoinTypes = [...new Set(coinNames)];\n for (const coinName of updateCoinTypes) {\n await updateOracle(txBlock, address, scallopUtils, coinName, isTestnet);\n }\n};\n\nconst updateOracle = async (\n txBlock: SuiTxBlock,\n address: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n isTestnet: boolean\n) => {\n const coinPackageId = address.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n const [vaaFromFeeId] = await scallopUtils.getVaas(\n [address.get(`core.coins.${coinName}.oracle.pyth.feed`)],\n isTestnet\n );\n\n updatePrice(\n txBlock,\n isTestnet ? ['pyth'] : ['pyth'],\n address.get('core.packages.xOracle.id'),\n address.get('core.oracles.xOracle'),\n address.get('core.packages.pyth.id'),\n address.get('core.oracles.pyth.registry'),\n address.get('core.oracles.pyth.state'),\n address.get('core.oracles.pyth.wormholeState'),\n address.get(`core.coins.${coinName}.oracle.pyth.feedObject`),\n vaaFromFeeId,\n address.get('core.packages.switchboard.id'),\n address.get('core.oracles.switchboard.registry'),\n address.get(`core.coins.${coinName}.oracle.switchboard`),\n address.get('core.packages.supra.id'),\n address.get('core.oracles.supra.registry'),\n 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 pythWormholeStateId - The whormhole state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param pythVaaFromFeeId - The vaa from pyth api with feed id.\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 * @returns Sui-Kit type transaction block.\n */\nfunction updatePrice(\n txBlock: SuiTxBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythWormholeStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n pythVaaFromFeeId: 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 pythWormholeStateId,\n pythFeedObjectId,\n pythVaaFromFeeId,\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 * @returns Sui-Kit type transaction block.\n */\nfunction priceUpdateRequest(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction confirmPriceUpdateRequest(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updateSupraPrice(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updateSwitchboardPrice(\n txBlock: SuiTxBlock,\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 * @returns Sui-Kit type transaction block.\n */\nfunction updatePythPrice(\n txBlock: SuiTxBlock,\n packageId: string,\n request: TransactionArgument,\n stateId: TransactionArgument | string,\n wormholeStateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n vaaFromFeeId: string,\n registryId: TransactionArgument | string,\n coinType: string\n) {\n const [updateFee] = txBlock.splitSUIFromGas([1]);\n txBlock.moveCall(\n `${packageId}::rule::set_price`,\n [\n request,\n wormholeStateId,\n stateId,\n feedObjectId,\n registryId,\n txBlock.pure([...fromB64(vaaFromFeeId)]),\n updateFee,\n SUI_CLOCK_OBJECT_ID,\n ],\n [coinType]\n );\n}\n","import { SuiTxBlock } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { SupportCoins } from '../types';\n\nexport const selectCoin = async (\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n amount: number,\n sender: string\n) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const coinType = scallopUtils.parseCoinType(coinPackageId, coinName);\n const coins = await scallopUtils.selectCoins(sender, amount, coinType);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n};\n\nexport const selectMarketCoin = async (\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n coinName: SupportCoins,\n amount: number,\n sender: string\n) => {\n const coinPackageId = scallopAddress.get(`core.coins.${coinName}.id`);\n const protocolPackageId = scallopAddress.get('core.packages.protocol.id');\n const coinType = scallopUtils.parseMarketCoinType(\n coinPackageId,\n protocolPackageId,\n coinName\n );\n const coins = await scallopUtils.selectCoins(sender, amount, coinType);\n const [takeCoin, leftCoin] = txBlock.takeAmountFromCoins(coins, amount);\n return { takeCoin, leftCoin };\n};\n","/**\n * This file contains the complex transaction builder, which contains multiple calls in a single transaction.\n */\nimport { SuiTxBlock, SuiKit } from '@scallop-io/sui-kit';\nimport { ScallopAddress, ScallopUtils } from '../models';\nimport { getObligations } from '../queries';\nimport { newTxBlock } from './normalMethods';\nimport {\n updateOraclesForBorrow,\n updateOraclesForWithdrawCollateral,\n updateOracles,\n} from './oracle';\nimport { selectCoin, selectMarketCoin } from './coin';\nimport type { SuiTxArg } from '@scallop-io/sui-kit';\nimport type { ScallopQuickMethodsHandler, ScallopTxBlock } from '../types';\n\nconst requireSender = (txBlock: SuiTxBlock) => {\n const sender = txBlock.blockData.sender;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n\nconst requireObligationInfo = async (\n ...args: [\n txBlock: SuiTxBlock,\n scallopAddress: ScallopAddress,\n suiKit: SuiKit,\n obligationId?: SuiTxArg | undefined,\n obligationKey?: SuiTxArg | undefined,\n ]\n) => {\n const [txBlock, scallopAddress, suiKit, obligationId, obligationKey] = args;\n if (args.length === 4 && obligationId) return { obligationId };\n if (args.length === 5 && obligationId && obligationKey)\n return { obligationId, obligationKey };\n const sender = requireSender(txBlock);\n const obligations = await getObligations(sender, scallopAddress, suiKit);\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\nconst scallopQuickMethodsHandler: ScallopQuickMethodsHandler = {\n addCollateralQuick:\n ({ txBlock, scallopAddress, scallopUtils, suiKit }) =>\n async (amount, coinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId\n );\n\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n txBlock.addCollateral(obligationArg, suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.addCollateral(obligationArg, takeCoin, coinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress, isTestnet }) =>\n async (amount, coinName, obligationId, obligationKey) => {\n const { obligationId: obligationArg, obligationKey: obligationKeyArg } =\n await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId,\n obligationKey\n );\n\n await updateOraclesForWithdrawCollateral(\n txBlock,\n scallopAddress,\n scallopUtils,\n suiKit,\n obligationArg as string,\n isTestnet\n );\n return txBlock.takeCollateral(\n obligationArg,\n obligationKeyArg as SuiTxArg,\n amount,\n coinName\n );\n },\n depositQuick:\n ({ txBlock, scallopUtils, scallopAddress }) =>\n async (amount, coinName) => {\n const sender = requireSender(txBlock);\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.deposit(suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.deposit(takeCoin, coinName);\n }\n },\n withdrawQuick:\n ({ txBlock, scallopUtils, scallopAddress }) =>\n async (amount, coinName) => {\n const sender = requireSender(txBlock);\n const { leftCoin, takeCoin } = await selectMarketCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.withdraw(takeCoin, coinName);\n },\n borrowQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress, isTestnet }) =>\n async (amount, coinName, obligationId, obligationKey) => {\n const { obligationId: obligationArg, obligationKey: obligationKeyArg } =\n await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId,\n obligationKey\n );\n\n await updateOraclesForBorrow(\n txBlock,\n scallopAddress,\n scallopUtils,\n suiKit,\n obligationArg as string,\n coinName,\n isTestnet\n );\n return txBlock.borrow(\n obligationArg,\n obligationKeyArg as SuiTxArg,\n amount,\n coinName\n );\n },\n repayQuick:\n ({ txBlock, suiKit, scallopUtils, scallopAddress }) =>\n async (amount, coinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(\n txBlock,\n scallopAddress,\n suiKit,\n obligationId\n );\n\n if (coinName === 'sui') {\n const [suiCoin] = txBlock.splitSUIFromGas([amount]);\n return txBlock.repay(obligationArg, suiCoin, coinName);\n } else {\n const { leftCoin, takeCoin } = await selectCoin(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinName,\n amount,\n sender\n );\n txBlock.transferObjects([leftCoin], sender);\n return txBlock.repay(obligationArg, takeCoin, coinName);\n }\n },\n updateAssetPricesQuick:\n ({ txBlock, scallopUtils, scallopAddress, isTestnet }) =>\n async (coinNames) => {\n return updateOracles(\n txBlock,\n scallopAddress,\n scallopUtils,\n coinNames,\n isTestnet\n );\n },\n};\n\nexport const newScallopTxBlock = (\n suiKit: SuiKit,\n scallopAddress: ScallopAddress,\n scallopUtils: ScallopUtils,\n isTestnet: boolean\n) => {\n const txBlock = newTxBlock(scallopAddress, scallopUtils);\n const txBlockProxy = new Proxy(txBlock, {\n get: (target, prop) => {\n if (prop in scallopQuickMethodsHandler) {\n return scallopQuickMethodsHandler[\n prop as keyof ScallopQuickMethodsHandler\n ]({\n txBlock: target,\n suiKit,\n scallopAddress,\n scallopUtils,\n isTestnet,\n });\n }\n return target[prop as keyof SuiTxBlock];\n },\n });\n return txBlockProxy as ScallopTxBlock;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,eAAe;AAErB,IAAM,eAAe;AAErB,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,CAAC,SAAS,eAAe,MAAM;AAEvD,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,0BAA0B;;;ACnCvC,IAAAA,kBAAuB;;;ACAvB,mBAAqC;AAY9B,IAAM,iBAAN,MAAqB;AAAA,EAQnB,YAAY,QAA8B;AAC/C,UAAM,EAAE,IAAI,MAAM,QAAQ,IAAI;AAE9B,QAAI;AAAM,WAAK,QAAQ;AACvB,SAAK,MAAM;AACX,SAAK,WAAW,WAAW;AAC3B,SAAK,gBAAgB,oBAAI,IAAI;AAC7B,SAAK,aAAa,aAAAC,QAAM,OAAO;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ;AACb,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAI,MAAyB;AAClC,QAAI,KAAK,YAAY;AACnB,YAAM,QAAQ,KACX,MAAM,GAAG,EACT;AAAA,QACC,CAAC,kBAAuB,QACtB,OAAO,qBAAqB,WACxB,iBAAiB,GAAG,IACpB;AAAA,QACN,KAAK;AAAA,MACP;AACF,aAAO,SAAS;AAAA,IAClB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAI,MAAyB,SAAiB;AACnD,QAAI,KAAK,YAAY;AACnB,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,WAAK,OAAO,CAAC,kBAAuB,KAAa,UAAU;AACzD,YAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,2BAAiB,GAAG,IAAI;AAAA,QAC1B,OAAO;AACL,iBAAO,iBAAiB,GAAG;AAAA,QAC7B;AAAA,MACF,GAAG,KAAK,UAAU;AAAA,IACpB;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,aAAa,SAAuB;AACzC,QAAI,SAAS;AACX,aAAO,KAAK,cAAc,IAAI,OAAO;AAAA,IACvC,OAAO;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,aAAa,SAAuB,WAAgC;AACzE,UAAM,gBAAgB,WAAW,KAAK;AACtC,UAAM,kBAAkB,aAAa,KAAK,cAAc;AACxD,QAAI,iBAAiB;AACnB,WAAK,cAAc,IAAI,eAAe,eAAe;AAAA,IACvD,OAAO;AAEL,WAAK,cAAc,IAAI,eAAe;AAAA,QACpC,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,sBAAsB;AAAA,UACtB,OAAO;AAAA,YACL,KAAK;AAAA,cACH,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,YACA,KAAK;AAAA,cACH,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,YACA,KAAK;AAAA,cACH,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,YACP,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO;AAAA,cACL,UAAU;AAAA,cACV,aAAa;AAAA,cACb,QAAQ;AAAA,YACV;AAAA,YACA,aAAa;AAAA,cACX,UAAU;AAAA,cACV,aAAa;AAAA,YACf;AAAA,YACA,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,aAAa;AAAA,cACb,OAAO;AAAA,cACP,UAAU;AAAA,cACV,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR,sBAAsB;AAAA,cACpB,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,WAAW;AAAA,cACT,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,GAAG;AAAA,cACD,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,UAAU;AAAA,cACR,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,OAAO;AAAA,cACL,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA;AAAA,YAEA,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA;AAAA,YAEA,aAAa;AAAA,cACX,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,YACA,SAAS;AAAA,cACP,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA;AAAA,YAEA,UAAU;AAAA,cACR,IAAI;AAAA,cACJ,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAkB;AACvB,WAAO,OAAO,YAAY,KAAK,aAAa;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAa,OACX,SACA,WACA,MACA;AACA,UAAM,SAAS,QAAQ,KAAK,SAAS;AACrC,UAAM,gBAAgB,WAAW,KAAK;AACtC,UAAM,kBAAkB,aAAa,KAAK,cAAc;AACxD,QAAI,WAAW,QAAW;AACxB,WAAK,cAAc,MAAM;AACzB,WAAK,aAAa,eAAe,eAAe;AAChD,YAAM,WAAW,MAAM,KAAK,WAAW;AAAA,QACrC,GAAG;AAAA,QACH,KAAK,UAAU,OAAO,YAAY,KAAK,aAAa,CAAC;AAAA,QACrD;AAAA,UACE,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,WAAW,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,mBAAW,CAACC,UAASC,UAAS,KAAK,OAAO;AAAA,UACxC,SAAS;AAAA,QACX,GAAG;AACD,cAAI,CAAC,YAAY,UAAU,WAAW,SAAS,EAAE,SAASD,QAAO,GAAG;AAClE,gBAAIA,aAAY,KAAK;AAAU,mBAAK,aAAaC;AACjD,iBAAK,cAAc,IAAID,UAAwBC,UAAS;AAAA,UAC1D;AAAA,QACF;AACA,aAAK,MAAM,SAAS,KAAK;AACzB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,cAAM,MAAM,6BAA6B;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,YAAM,MAAM,mDAAmD;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,KAAK,IAAa;AAC7B,UAAM,cAAc,MAAM,KAAK,OAAO;AAEtC,QAAI,gBAAgB,QAAW;AAC7B,YAAM,WAAW,MAAM,KAAK,WAAW;AAAA,QACrC,GAAG,0BAA0B;AAAA,QAC7B;AAAA,UACE,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,mBAAW,CAAC,SAAS,SAAS,KAAK,OAAO;AAAA,UACxC,SAAS;AAAA,QACX,GAAG;AACD,cAAI,CAAC,YAAY,UAAU,WAAW,SAAS,EAAE,SAAS,OAAO,GAAG;AAClE,gBAAI,YAAY,KAAK;AAAU,mBAAK,aAAa;AACjD,iBAAK,cAAc,IAAI,SAAwB,SAAS;AAAA,UAC1D;AAAA,QACF;AACA,aAAK,MAAM,SAAS,KAAK;AACzB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,cAAM,MAAM,6BAA6B;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,OACX,IACA,SACA,WACA,MACA;AACA,UAAM,SAAS,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAW,MAAM,KAAK,OAAO;AACnC,UAAM,gBAAgB,WAAW,KAAK;AACtC,UAAM,kBAAkB,aAAa,KAAK,cAAc;AACxD,QAAI,aAAa;AAAW,YAAM,MAAM,uBAAuB;AAC/D,QAAI,WAAW,QAAW;AACxB,UAAI,OAAO,KAAK,KAAK;AACnB,aAAK,cAAc,MAAM;AAAA,MAC3B;AACA,WAAK,aAAa,eAAe,eAAe;AAChD,YAAM,WAAW,MAAM,KAAK,WAAW;AAAA,QACrC,GAAG,0BAA0B;AAAA,QAC7B,KAAK,UAAU,OAAO,YAAY,KAAK,aAAa,CAAC;AAAA,QACrD;AAAA,UACE,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,WAAW,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,mBAAW,CAACD,UAASC,UAAS,KAAK,OAAO;AAAA,UACxC,SAAS;AAAA,QACX,GAAG;AACD,cAAI,CAAC,YAAY,UAAU,WAAW,SAAS,EAAE,SAASD,QAAO,GAAG;AAClE,gBAAIA,aAAY,KAAK;AAAU,mBAAK,aAAaC;AACjD,iBAAK,cAAc,IAAID,UAAwBC,UAAS;AAAA,UAC1D;AAAA,QACF;AACA,aAAK,MAAM,SAAS,KAAK;AACzB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,cAAM,MAAM,6BAA6B;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,YAAM,MAAM,mDAAmD;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,OAAO,IAAa,MAAe;AAC9C,UAAM,SAAS,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAW,MAAM,KAAK,OAAO;AACnC,QAAI,aAAa;AAAW,YAAM,MAAM,uBAAuB;AAC/D,QAAI,WAAW,QAAW;AACxB,YAAM,WAAW,MAAM,KAAK,WAAW;AAAA,QACrC,GAAG,0BAA0B;AAAA,QAC7B;AAAA,UACE,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,WAAW,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,aAAK,MAAM;AACX,aAAK,aAAa;AAClB,aAAK,cAAc,MAAM;AAAA,MAC3B,OAAO;AACL,cAAM,MAAM,6BAA6B;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,YAAM,MAAM,mDAAmD;AAAA,IACjE;AAAA,EACF;AACF;;;AC3cA,IAAAC,cAAoC;AACpC,IAAAC,kBAAuB;;;ACDvB,iBAIO;AACP,qBAAuB;AACvB,kCAAuC;AAehC,IAAM,eAAN,MAAmB;AAAA,EAGjB,YAAY,QAAuB;AACxC,SAAK,UAAU,IAAI,sBAAO,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,YACX,OACA,QACA,WAAmB,yBACnB;AACA,UAAM,QAAQ,MAAM,KAAK,QAAQ,cAAc;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,QAAQ,UAAoB,WAAqB;AAC5D,UAAM,aAAa,IAAI;AAAA,MACrB,YACI,oCACA;AAAA,MACJ;AAAA,QACE,wBAAwB;AAAA,UACtB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,WAAO,MAAM,WAAW,cAAc,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cAAc,eAAuB,UAAkB;AAC5D,QAAI,aAAa;AAAO,iBAAO,+BAAmB,uBAAY;AAC9D,UAAM,gBAAgB;AAAA;AAAA,MAEpB;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,IACF;AACA,QAAI,cAAc,SAAS,aAAa,GAAG;AACzC,aAAO,GAAG;AAAA,IACZ,OAAO;AACL,aAAO,GAAG,kBAAkB,aAAa,SAAS,YAAY;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,wBAAwB,UAAkB;AAC/C,UAAM,oBAAoB;AAAA;AAAA,MAExB;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,IACF;AAEA,QAAI,aAAa,kBAAkB,CAAC,GAAG;AACrC,aAAO;AAAA,IACT,WAAW,aAAa,kBAAkB,CAAC,GAAG;AAC5C,aAAO;AAAA,IACT,WAAW,aAAa,kBAAkB,CAAC,GAAG;AAC5C,aAAO;AAAA,IACT,OAAO;AACL,aAAO,SAAS,MAAM,IAAI,EAAE,CAAC,EAAE,YAAY;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,oBACL,eACA,eACA,UACA;AACA,UAAM,WAAW,KAAK;AAAA,MACpB,aAAa,QAAQ,mCAAwB;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,GAAG,sCAAsC;AAAA,EAClD;AACF;;;AC1IA,IAAAC,kBAAmC;AACnC,uBAAsB;AAWf,IAAM,cAAc,OACzB,gBACA,QACA,cACA,aACG;AACH,QAAM,YAAY,eAAe,IAAI,wBAAwB;AAC7D,QAAM,WAAW,eAAe,IAAI,aAAa;AACjD,QAAM,UAAU,IAAI,2BAAW;AAC/B,QAAM,cAAc,GAAG;AACvB,UAAQ,SAAS,aAAa,CAAC,QAAQ,CAAC;AACxC,QAAM,cAAc,MAAM,OAAO,WAAW,OAAO;AACnD,QAAM,aAAa,YAAY,OAAO,CAAC,EAAE;AAEzC,QAAM,SAA+B,CAAC;AACtC,QAAM,cAAyC,CAAC;AAEhD,aAAW,SAAS,WAAW,OAAO;AAEpC,UAAM,WAAW,OAAO,MAAM,KAAK;AACnC,UAAM,mBAAmB,KAAK,MAAM;AACpC,UAAM,iBAAiB,OAAO,MAAM,qBAAqB,KAAK,IAAI,KAAK;AACvE,UAAM,uBACJ,OAAO,MAAM,qBAAqB,KAAK,IAAI,KAAK;AAClD,UAAM,sBACJ,OAAO,MAAM,oBAAoB,KAAK,IAAI,KAAK;AACjD,UAAM,gBAAgB,OAAO,MAAM,cAAc,KAAK,IAAI,KAAK;AAC/D,UAAM,WAAW,OAAO,MAAM,SAAS,KAAK,IAAI,KAAK;AACrD,UAAM,UAAU,OAAO,MAAM,QAAQ,KAAK,IAAI,KAAK;AACnD,UAAM,aAAa,OAAO,MAAM,aAAa,KAAK,IAAI,KAAK;AAC3D,UAAM,kBAAkB,OAAO,MAAM,iBAAiB;AACtD,UAAM,cAAc,OAAO,MAAM,WAAW;AAC5C,UAAM,cAAc,OAAO,MAAM,WAAW;AAC5C,UAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,UAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,UAAM,mBAAmB,OAAO,MAAM,gBAAgB;AACtD,UAAM,kBAAkB,OAAO,MAAM,eAAe;AACpD,UAAM,UAAU,OAAO,MAAM,OAAO;AACpC,UAAM,gBAAgB,OAAO,MAAM,cAAc,KAAK,IAAI,KAAK;AAC/D,UAAM,eAAe,OAAO,MAAM,aAAa,KAAK,IAAI,KAAK;AAG7D,UAAM,2BACJ,aAAa,QACR,iBAAiB,mBAAoB,mBACrC,IAAI,iBAAiB,oBAAoB,mBAAmB;AACnE,UAAM,iCACJ,aAAa,QACR,uBAAuB,mBAAoB,mBAC3C,IAAI,uBAAuB,oBAAoB,mBAAmB;AACzE,UAAM,gCACJ,aAAa,QACR,sBAAsB,mBAAoB,mBAC1C,IAAI,sBAAsB,oBAAoB,mBAAmB;AACxE,UAAM,0BACJ,aAAa,QACR,gBAAgB,mBAAoB,mBACpC,IAAI,gBAAgB,oBAAoB,mBAAmB;AAClE,UAAM,uBACJ,aAAa,QACR,aAAa,mBAAoB,mBACjC,IAAI,aAAa,oBAAoB,mBAAmB;AAE/D,UAAM,YAAY,KAAK,OAAM,oBAAI,KAAK,GAAE,QAAQ,IAAI,GAAI,IAAI;AAC5D,UAAM,uBAAmB,iBAAAC,SAAU,WAAW,EAC3C,iBAAa,iBAAAA,SAAU,SAAS,EAAE,aAAa,UAAU,CAAC,EAC1D,UAAU,eAAe;AAC5B,UAAM,yBAAqB,iBAAAA,SAAU,WAAW,EAAE,KAAK,gBAAgB;AAEvE,UAAM,qBAAiB,iBAAAA,SAAU,kBAAkB,EAChD,UAAU,WAAW,EACrB,MAAM,CAAC;AACV,UAAM,oBAAgB,iBAAAA,SAAU,IAAI,EAAE,aAAa,cAAc;AACjE,UAAM,mBAAmB,cAAc,KAAK,IAAI;AAChD,UAAM,0BAAsB,iBAAAA,SAAU,OAAO,EAAE;AAAA,MAC7C,cAAc,aAAa,aAAa;AAAA,IAC1C;AACA,UAAM,yBAAqB,iBAAAA,SAAU,gBAAgB,EAAE;AAAA,MACrD,KAAK,IAAI,OAAO,oBAAoB,SAAS,GAAG,CAAC;AAAA,IACnD;AACA,QAAI,sBACF,iBAAAA,SAAU,gBAAgB,EAAE,UAAU,kBAAkB;AAC1D,sBAAkB,gBAAgB,SAAS,IACvC,sBACA,iBAAAA,SAAU,CAAC;AACf,QAAI,iBAAa,iBAAAA,SAAU,oBAAoB,EAC5C,aAAa,eAAe,EAC5B,aAAa,IAAI,aAAa;AACjC,iBAAa,WAAW,SAAS,IAAI,iBAAa,iBAAAA,SAAU,CAAC;AAG7D,UAAM,OAAO,aAAa;AAAA,MACxB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,YAAY;AAChC,UAAM,iBAAiB,aAAa;AAAA,MAClC,eAAe,IAAI,cAAc,SAAS;AAAA,MAC1C,eAAe,IAAI,2BAA2B;AAAA,MAC9C;AAAA,IACF;AACA,UAAM,cACJ,SAAS,UAAU,SAAS,UAAU,SAAS,QAC3C;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR,IACA;AAEN,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV,iBAAiB,gBAAgB,SAAS;AAAA,QAC1C,gBAAgB;AAAA,QAChB,oBAAoB,KAAK;AAAA,UACvB;AAAA,UACA;AAAA,QACF;AAAA,QACA,oBAAoB,WAAW,SAAS;AAAA,QACxC,uBAAuB,eAAe,SAAS;AAAA,QAC/C,oBAAoB,mBAAmB,SAAS;AAAA,QAChD,oBAAoB,mBAAmB,SAAS;AAAA,QAChD,kBAAkB,iBAAiB,SAAS;AAAA,QAC5C,qBAAqB,oBAAoB,SAAS;AAAA,MACpD;AAAA,MACA,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,QACrB,YAAY;AAAA,QACZ,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,cAAc,WAAW,aAAa;AAE/C,UAAM,WAAW,OAAO,WAAW,KAAK;AACxC,UAAM,mBACJ,OAAO,WAAW,iBAAiB,KAAK,IAAI,KAAK;AACnD,UAAM,oBACJ,OAAO,WAAW,kBAAkB,KAAK,IAAI,KAAK;AACpD,UAAM,sBACJ,OAAO,WAAW,oBAAoB,KAAK,IAAI,KAAK;AACtD,UAAM,qBACJ,OAAO,WAAW,mBAAmB,KAAK,IAAI,KAAK;AACrD,UAAM,2BACJ,OAAO,WAAW,yBAAyB,KAAK,IAAI,KAAK;AAC3D,UAAM,sBAAsB,OAAO,WAAW,mBAAmB;AACjE,UAAM,wBAAwB,OAAO,WAAW,qBAAqB;AAGrE,UAAM,OAAO,aAAa;AAAA,MACxB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,YAAY;AAChC,UAAM,cACJ,SAAS,UAAU,SAAS,UAAU,SAAS,QAC3C;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR,IACA;AAEN,gBAAY,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ACpNA,IAAAC,kBAAmC;AAI5B,IAAM,kBAAkB,OAC7B,cACA,gBACA,WACG;AACH,QAAM,YAAY,eAAe,IAAI,wBAAwB;AAC7D,QAAM,cAAc,GAAG;AACvB,QAAM,UAAU,IAAI,2BAAW;AAC/B,UAAQ,SAAS,aAAa,CAAC,YAAY,CAAC;AAC5C,QAAM,cAAc,MAAM,OAAO,WAAW,OAAO;AACnD,SAAO,YAAY,OAAO,CAAC,EAAE;AAC/B;AAEO,IAAM,iBAAiB,OAC5B,cACA,gBACA,WACG;AACH,QAAM,QAAQ,gBAAgB,OAAO,eAAe;AACpD,QAAM,gBAAgB,MAAM,OAAO,SAAS,EAAE,gBAAgB;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,GAAG,eAAe;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,SAAS,cAAc,KAC1B,IAAI,CAAC,QAAa,KAAK,MAAM,QAAQ,EACrC,OAAO,CAAC,OAAY,OAAO,MAAS;AACvC,QAAM,aAAa,MAAM,OAAO,WAAW,MAAM;AACjD,QAAM,cAA+C,CAAC;AACtD,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,UAAU;AACxB,UAAM,SAAS,UAAU;AACzB,UAAM,eAAe,OAAO,WAAW,EAAE,QAAQ,EAAE,IAAI;AACvD,gBAAY,KAAK,EAAE,IAAI,cAAc,MAAM,CAAC;AAAA,EAC9C;AACA,SAAO;AACT;;;AC3CA,IAAAC,cAAoC;AACpC,IAAAC,kBAA2B;AAQ3B,IAAM,8BAA2D;AAAA,EAC/D,gBACE,CAAC,EAAE,SAAS,QAAQ,MACpB,MACE,QAAQ;AAAA,IACN,GAAG,QAAQ;AAAA,IACX,CAAC,QAAQ,OAAO;AAAA,EAClB;AAAA,EACJ,kBACE,CAAC,EAAE,SAAS,QAAQ,MACpB,CAAC,YAAY,wBACX,QAAQ;AAAA,IACN,GAAG,QAAQ;AAAA,IACX,CAAC,QAAQ,SAAS,YAAY,mBAAmB;AAAA,EACnD;AAAA,EACJ,qBACE,CAAC,EAAE,SAAS,QAAQ,MACpB,MACE,QAAQ;AAAA,IACN,GAAG,QAAQ;AAAA,IACX,CAAC,QAAQ,OAAO;AAAA,EAClB;AAAA,EACJ,eACE,CAAC,EAAE,SAAS,SAAS,cAAc,eAAe,MAClD,CAAC,YAAY,MAAM,aAAa;AAC9B,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,YAAY,QAAQ,QAAQ,IAAI;AAAA,MAClD,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,gBACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,eAAe,QAAQ,aAAa;AAC/C,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,SACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,MAAM,aAAa;AAClB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,MAAM,+BAAmB;AAAA,MAC3D,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,cACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,MAAM,aAAa;AAClB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,MAAM,+BAAmB;AAAA,MAC3D,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,UACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,aAAa;AACxB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,YAAY,+BAAmB;AAAA,MACjE,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,eACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,aAAa;AACxB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,YAAY,+BAAmB;AAAA,MACjE,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,QACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,eAAe,QAAQ,aAAa;AAC/C,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,aACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,eAAe,QAAQ,aAAa;AAC/C,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,OACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,YAAY,MAAM,aAAa;AAC9B,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,iBACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,QAAQ,aAAa;AACpB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AAAA,MACxC,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACF,gBACE,CAAC,EAAE,SAAS,SAAS,gBAAgB,aAAa,MAClD,CAAC,MAAM,MAAM,aAAa;AACxB,UAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,UAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,WAAO,QAAQ;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,CAAC,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAAA,MAC5C,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AACJ;AAEO,IAAM,aAAa,CACxB,gBACA,iBACG;AACH,QAAM,UAAmB;AAAA,IACvB,aAAa,eAAe,IAAI,2BAA2B;AAAA,IAC3D,QAAQ,eAAe,IAAI,aAAa;AAAA,IACxC,SAAS,eAAe,IAAI,cAAc;AAAA,IAC1C,MAAM,eAAe,IAAI,2BAA2B;AAAA,IACpD,QAAQ,eAAe,IAAI,sBAAsB;AAAA,EACnD;AACA,QAAM,UAAU,IAAI,2BAAW;AAC/B,QAAM,eAAe,IAAI,MAAM,SAAS;AAAA,IACtC,KAAK,CAAC,QAAQ,SAAS;AACrB,UAAI,QAAQ,6BAA6B;AACvC,eAAO,4BACL,IACF,EAAE;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,OAAO,IAAwB;AAAA,IACxC;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;ACvNA,iBAAwB;AACxB,IAAAC,cAAyD;AAMlD,IAAM,qCAAqC,OAChD,SACA,SACA,cACA,QACA,cACA,cACG;AACH,QAAM,sBAAsB,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAyBO,IAAM,yBAAyB,OACpC,SACA,SACA,cACA,QACA,cACA,gBACA,cACG;AACH,QAAM,sBAAsB,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,GAAG,oBAAI,IAAI,CAAC,GAAG,qBAAqB,cAAc,CAAC;AAAA,EACrD;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB,OAC7B,QACA,cACA,SACA,iBACG;AACH,QAAM,aAAa,MAAM,gBAAgB,cAAc,SAAS,MAAM;AACtE,QAAM,sBAAsB,WAAW,YAAY,IAAI,CAAC,eAAe;AACrE,WAAO,KAAK,WAAW,KAAK;AAAA,EAC9B,CAAC;AACD,QAAM,gBAAgB,WAAW,MAAM,IAAI,CAAC,SAAS;AACnD,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB,CAAC;AACD,QAAM,sBAAsB;AAAA,IAC1B,GAAG,oBAAI,IAAI,CAAC,GAAG,qBAAqB,GAAG,aAAa,CAAC;AAAA,EACvD;AACA,QAAM,sBAAsB,oBAAoB,IAAI,CAAC,aAAa;AAChE,WAAO,aAAa,wBAAwB,QAAQ;AAAA,EACtD,CAAC;AACD,SAAO;AACT;AAEO,IAAM,gBAAgB,OAC3B,SACA,SACA,cACA,WACA,cACG;AACH,QAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAC9C,aAAW,YAAY,iBAAiB;AACtC,UAAM,aAAa,SAAS,SAAS,cAAc,UAAU,SAAS;AAAA,EACxE;AACF;AAEA,IAAM,eAAe,OACnB,SACA,SACA,cACA,UACA,cACG;AACH,QAAM,gBAAgB,QAAQ,IAAI,cAAc,aAAa;AAC7D,QAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,QAAM,CAAC,YAAY,IAAI,MAAM,aAAa;AAAA,IACxC,CAAC,QAAQ,IAAI,cAAc,2BAA2B,CAAC;AAAA,IACvD;AAAA,EACF;AAEA;AAAA,IACE;AAAA,IACA,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM;AAAA,IAC9B,QAAQ,IAAI,0BAA0B;AAAA,IACtC,QAAQ,IAAI,sBAAsB;AAAA,IAClC,QAAQ,IAAI,uBAAuB;AAAA,IACnC,QAAQ,IAAI,4BAA4B;AAAA,IACxC,QAAQ,IAAI,yBAAyB;AAAA,IACrC,QAAQ,IAAI,iCAAiC;AAAA,IAC7C,QAAQ,IAAI,cAAc,iCAAiC;AAAA,IAC3D;AAAA,IACA,QAAQ,IAAI,8BAA8B;AAAA,IAC1C,QAAQ,IAAI,mCAAmC;AAAA,IAC/C,QAAQ,IAAI,cAAc,6BAA6B;AAAA,IACvD,QAAQ,IAAI,wBAAwB;AAAA,IACpC,QAAQ,IAAI,6BAA6B;AAAA,IACzC,QAAQ,IAAI,2BAA2B;AAAA,IACvC;AAAA,EACF;AACF;AAwBA,SAAS,YACP,SACA,OACA,kBACA,WACA,eACA,gBACA,aACA,qBACA,kBACA,kBACA,sBACA,uBACA,yBACA,gBACA,iBACA,eACA,UACA;AACA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,aAAa,GAAG;AACjC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,OAAO,GAAG;AAC3B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAWA,SAAS,mBACP,SACA,WACA,WACA,UACA;AACA,QAAM,SAAS,GAAG;AAClB,QAAM,WAAW,CAAC,QAAQ;AAC1B,SAAO,QAAQ,SAAS,QAAQ,CAAC,SAAS,GAAG,QAAQ;AACvD;AAYA,SAAS,0BACP,SACA,WACA,WACA,SACA,UACA;AACA,QAAM,SAAS,GAAG;AAClB,QAAM,WAAW,CAAC,QAAQ;AAC1B,UAAQ,SAAS,QAAQ,CAAC,WAAW,SAAS,+BAAmB,GAAG,QAAQ;AAC5E,SAAO;AACT;AAaA,SAAS,iBACP,SACA,WACA,SACA,UACA,YACA,UACA;AACA,UAAQ;AAAA,IACN,GAAG;AAAA,IACH,CAAC,SAAS,UAAU,YAAY,+BAAmB;AAAA,IACnD,CAAC,QAAQ;AAAA,EACX;AACF;AAaA,SAAS,uBACP,SACA,WACA,SACA,cACA,YACA,UACA;AACA,UAAQ;AAAA,IACN,GAAG;AAAA,IACH,CAAC,SAAS,cAAc,YAAY,+BAAmB;AAAA,IACvD,CAAC,QAAQ;AAAA,EACX;AACF;AAgBA,SAAS,gBACP,SACA,WACA,SACA,SACA,iBACA,cACA,cACA,YACA,UACA;AACA,QAAM,CAAC,SAAS,IAAI,QAAQ,gBAAgB,CAAC,CAAC,CAAC;AAC/C,UAAQ;AAAA,IACN,GAAG;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,CAAC,OAAG,oBAAQ,YAAY,CAAC,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AACF;;;ACnXO,IAAM,aAAa,OACxB,SACA,gBACA,cACA,UACA,QACA,WACG;AACH,QAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,QAAM,WAAW,aAAa,cAAc,eAAe,QAAQ;AACnE,QAAM,QAAQ,MAAM,aAAa,YAAY,QAAQ,QAAQ,QAAQ;AACrE,QAAM,CAAC,UAAU,QAAQ,IAAI,QAAQ,oBAAoB,OAAO,MAAM;AACtE,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEO,IAAM,mBAAmB,OAC9B,SACA,gBACA,cACA,UACA,QACA,WACG;AACH,QAAM,gBAAgB,eAAe,IAAI,cAAc,aAAa;AACpE,QAAM,oBAAoB,eAAe,IAAI,2BAA2B;AACxE,QAAM,WAAW,aAAa;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,aAAa,YAAY,QAAQ,QAAQ,QAAQ;AACrE,QAAM,CAAC,UAAU,QAAQ,IAAI,QAAQ,oBAAoB,OAAO,MAAM;AACtE,SAAO,EAAE,UAAU,SAAS;AAC9B;;;ACrBA,IAAM,gBAAgB,CAAC,YAAwB;AAC7C,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AACA,SAAO;AACT;AAEA,IAAM,wBAAwB,UACzB,SAOA;AACH,QAAM,CAAC,SAAS,gBAAgB,QAAQ,cAAc,aAAa,IAAI;AACvE,MAAI,KAAK,WAAW,KAAK;AAAc,WAAO,EAAE,aAAa;AAC7D,MAAI,KAAK,WAAW,KAAK,gBAAgB;AACvC,WAAO,EAAE,cAAc,cAAc;AACvC,QAAM,SAAS,cAAc,OAAO;AACpC,QAAM,cAAc,MAAM,eAAe,QAAQ,gBAAgB,MAAM;AACvE,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,kCAAkC,QAAQ;AAAA,EAC5D;AACA,SAAO;AAAA,IACL,cAAc,YAAY,CAAC,EAAE;AAAA,IAC7B,eAAe,YAAY,CAAC,EAAE;AAAA,EAChC;AACF;AAEA,IAAM,6BAAyD;AAAA,EAC7D,oBACE,CAAC,EAAE,SAAS,gBAAgB,cAAc,OAAO,MACjD,OAAO,QAAQ,UAAU,iBAAiB;AACxC,UAAM,SAAS,cAAc,OAAO;AACpC,UAAM,EAAE,cAAc,cAAc,IAAI,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,aAAa,OAAO;AACtB,YAAM,CAAC,OAAO,IAAI,QAAQ,gBAAgB,CAAC,MAAM,CAAC;AAClD,cAAQ,cAAc,eAAe,SAAS,QAAQ;AAAA,IACxD,OAAO;AACL,YAAM,EAAE,UAAU,SAAS,IAAI,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,cAAc,eAAe,UAAU,QAAQ;AACvD,cAAQ,gBAAgB,CAAC,QAAQ,GAAG,MAAM;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,qBACE,CAAC,EAAE,SAAS,QAAQ,cAAc,gBAAgB,UAAU,MAC5D,OAAO,QAAQ,UAAU,cAAc,kBAAkB;AACvD,UAAM,EAAE,cAAc,eAAe,eAAe,iBAAiB,IACnE,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACF,cACE,CAAC,EAAE,SAAS,cAAc,eAAe,MACzC,OAAO,QAAQ,aAAa;AAC1B,UAAM,SAAS,cAAc,OAAO;AACpC,QAAI,aAAa,OAAO;AACtB,YAAM,CAAC,OAAO,IAAI,QAAQ,gBAAgB,CAAC,MAAM,CAAC;AAClD,aAAO,QAAQ,QAAQ,SAAS,QAAQ;AAAA,IAC1C,OAAO;AACL,YAAM,EAAE,UAAU,SAAS,IAAI,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,gBAAgB,CAAC,QAAQ,GAAG,MAAM;AAC1C,aAAO,QAAQ,QAAQ,UAAU,QAAQ;AAAA,IAC3C;AAAA,EACF;AAAA,EACF,eACE,CAAC,EAAE,SAAS,cAAc,eAAe,MACzC,OAAO,QAAQ,aAAa;AAC1B,UAAM,SAAS,cAAc,OAAO;AACpC,UAAM,EAAE,UAAU,SAAS,IAAI,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,gBAAgB,CAAC,QAAQ,GAAG,MAAM;AAC1C,WAAO,QAAQ,SAAS,UAAU,QAAQ;AAAA,EAC5C;AAAA,EACF,aACE,CAAC,EAAE,SAAS,QAAQ,cAAc,gBAAgB,UAAU,MAC5D,OAAO,QAAQ,UAAU,cAAc,kBAAkB;AACvD,UAAM,EAAE,cAAc,eAAe,eAAe,iBAAiB,IACnE,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACF,YACE,CAAC,EAAE,SAAS,QAAQ,cAAc,eAAe,MACjD,OAAO,QAAQ,UAAU,iBAAiB;AACxC,UAAM,SAAS,cAAc,OAAO;AACpC,UAAM,EAAE,cAAc,cAAc,IAAI,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,aAAa,OAAO;AACtB,YAAM,CAAC,OAAO,IAAI,QAAQ,gBAAgB,CAAC,MAAM,CAAC;AAClD,aAAO,QAAQ,MAAM,eAAe,SAAS,QAAQ;AAAA,IACvD,OAAO;AACL,YAAM,EAAE,UAAU,SAAS,IAAI,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,gBAAgB,CAAC,QAAQ,GAAG,MAAM;AAC1C,aAAO,QAAQ,MAAM,eAAe,UAAU,QAAQ;AAAA,IACxD;AAAA,EACF;AAAA,EACF,wBACE,CAAC,EAAE,SAAS,cAAc,gBAAgB,UAAU,MACpD,OAAO,cAAc;AACnB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACJ;AAEO,IAAM,oBAAoB,CAC/B,QACA,gBACA,cACA,cACG;AACH,QAAM,UAAU,WAAW,gBAAgB,YAAY;AACvD,QAAM,eAAe,IAAI,MAAM,SAAS;AAAA,IACtC,KAAK,CAAC,QAAQ,SAAS;AACrB,UAAI,QAAQ,4BAA4B;AACtC,eAAO,2BACL,IACF,EAAE;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,OAAO,IAAwB;AAAA,IACxC;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;APtMO,IAAM,gBAAN,MAAoB;AAAA,EAQlB,YACL,QACA,SACA,eACA,WACA;AACA,SAAK,SAAS,IAAI,uBAAO,MAAM;AAC/B,SAAK,UAAU;AACf,SAAK,oBAAgB;AAAA,MACnB,iBAAiB,KAAK,OAAO,eAAe;AAAA,IAC9C;AACA,SAAK,SAAS,IAAI,aAAa,MAAM;AACrC,SAAK,aACH,cACC,OAAO,cAAc,OAAO,gBAAgB,YAAY;AAAA,EAC7D;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,YAAY,WAA0B,OAAO;AACxD,WAAO,YAAY,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,cAAuB;AAC1C,UAAM,QAAQ,gBAAgB,KAAK;AACnC,WAAO,eAAe,OAAO,KAAK,SAAS,KAAK,MAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,gBAAgB,cAAsB;AACjD,WAAO,gBAAgB,cAAc,KAAK,SAAS,KAAK,MAAM;AAAA,EAChE;AAAA,EAYA,MAAa,eACX,OAAU,MAC6B;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,YAAQ,oBAAoB;AAC5B,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAuBA,MAAa,kBACX,UACA,QACA,OAAU,MACV,cACA,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,QAAI,cAAc;AAChB,YAAM,QAAQ,mBAAmB,QAAQ,UAAU,YAAY;AAAA,IACjE,OAAO;AACL,YAAM,CAAC,YAAY,eAAe,SAAS,IAAI,QAAQ,eAAe;AACtE,YAAM,QAAQ,mBAAmB,QAAQ,UAAU,UAAU;AAC7D,cAAQ,iBAAiB,YAAY,SAAS;AAC9C,cAAQ,gBAAgB,CAAC,aAAa,GAAG,MAAM;AAAA,IACjD;AAEA,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,mBACX,UACA,QACA,OAAU,MACV,cACA,eACA,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,UAAM,iBAAiB,MAAM,QAAQ;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,gBAAgB,CAAC,cAAc,GAAG,MAAM;AAEhD,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAqBA,MAAa,QACX,UACA,QACA,OAAU,MACV,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,UAAM,aAAa,MAAM,QAAQ,aAAa,QAAQ,QAAQ;AAC9D,YAAQ,gBAAgB,CAAC,UAAU,GAAG,MAAM;AAE5C,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAqBA,MAAa,SACX,UACA,QACA,OAAU,MACV,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,UAAM,OAAO,MAAM,QAAQ,cAAc,QAAQ,QAAQ;AACzD,YAAQ,gBAAgB,CAAC,IAAI,GAAG,MAAM;AAEtC,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,OACX,UACA,QACA,OAAU,MACV,cACA,eACA,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,UAAM,OAAO,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,gBAAgB,CAAC,IAAI,GAAG,MAAM;AAEtC,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,MACX,UACA,QACA,OAAU,MACV,cACA,eACuC;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS,iBAAiB,KAAK;AACrC,YAAQ,UAAU,MAAM;AAExB,UAAM,QAAQ,WAAW,QAAQ,UAAU,YAAY;AAEvD,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EA4BA,MAAa,UACX,UACA,QACA,UAIA,OAAU,MAC6B;AACvC,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,CAAC,MAAM,IAAI,IAAI,QAAQ,gBAAgB,QAAQ,QAAQ;AAC7D,YAAQ,eAAe,SAAS,SAAS,IAAI,GAAG,MAAM,QAAQ;AAE9D,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAwBA,MAAa,aACX,UACA,QACA,OAAU,MACV,gBACuC;AACvC,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,YAAY,kBAAkB,KAAK;AACzC,UAAM,YAAY,KAAK,QAAQ,IAAI,2BAA2B;AAC9D,UAAM,aAAa,KAAK,QAAQ,IAAI,cAAc,mBAAmB;AACrE,UAAM,SAAS,GAAG,cAAc;AAChC,UAAM,OAAO,QAAQ,SAAS,QAAQ,CAAC,YAAY,MAAM,CAAC;AAC1D,YAAQ,gBAAgB,CAAC,IAAI,GAAG,SAAS;AAEzC,QAAI,MAAM;AACR,aAAQ,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;;;AFzbO,IAAM,UAAN,MAAc;AAAA,EAKZ,YAAY,QAAuB;AACxC,SAAK,SAAS;AACd,SAAK,SAAS,IAAI,uBAAO,MAAM;AAC/B,SAAK,UAAU,IAAI,eAAe;AAAA,MAChC,IAAI,QAAQ,eAAe;AAAA,MAC3B,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,kBAAkB;AAC7B,UAAM,KAAK,QAAQ,KAAK;AACxB,UAAM,eAAe,IAAI,aAAa,KAAK,MAAM;AACjD,UAAM,SAAS,IAAI,uBAAO,KAAK,MAAM;AACrC,UAAM,YAAY,KAAK,OAAO,gBAAgB;AAC9C,WAAO;AAAA,MACL,eAAe,MAAM;AACnB,eAAO,kBAAkB,QAAQ,KAAK,SAAS,cAAc,SAAS;AAAA,MACxE;AAAA,MACA,oBAAoB,CAAC,YAA4B;AAC/C,eAAO,OAAO,eAAe,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,cAAc,IAAY,MAAc,SAAsB;AACnE,WAAO,IAAI,eAAe,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,oBAAoB,eAAwB;AACvD,UAAM,KAAK,QAAQ,KAAK;AACxB,WAAO,IAAI,cAAc,KAAK,QAAQ,KAAK,SAAS,aAAa;AAAA,EACnE;AACF;","names":["import_sui_kit","axios","network","addresses","import_sui","import_sui_kit","import_sui_kit","BigNumber","import_sui_kit","import_sui","import_sui_kit","import_sui"]}