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

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
@@ -556,7 +556,9 @@ var ScallopUtils = class {
556
556
  // USDC
557
557
  "0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf",
558
558
  // USDT
559
- "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c"
559
+ "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c",
560
+ // ETH
561
+ "0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5"
560
562
  ];
561
563
  if (wormHoleCoins.includes(coinPackageId)) {
562
564
  return `${coinPackageId}::coin::COIN`;
@@ -575,12 +577,16 @@ var ScallopUtils = class {
575
577
  // USDC
576
578
  "0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN",
577
579
  // USDT
578
- "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN"
580
+ "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN",
581
+ // ETH
582
+ "0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN"
579
583
  ];
580
584
  if (coinType === wormHoleCoinTypes[0]) {
581
585
  return "usdc";
582
586
  } else if (coinType === wormHoleCoinTypes[1]) {
583
587
  return "usdt";
588
+ } else if (coinType === wormHoleCoinTypes[2]) {
589
+ return "eth";
584
590
  } else {
585
591
  return coinType.split("::")[2].toLowerCase();
586
592
  }
@@ -666,7 +672,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
666
672
  scallopAddress.get("core.packages.protocol.id"),
667
673
  coin
668
674
  );
669
- const wrappedType = coin === "usdc" ? {
675
+ const wrappedType = coin === "usdc" || coin === "usdt" || coin === "eth" ? {
670
676
  from: "Wormhole",
671
677
  type: "Portal from Ethereum"
672
678
  } : void 0;
@@ -723,7 +729,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
723
729
  coinType
724
730
  );
725
731
  const symbol = coin.toUpperCase();
726
- const wrappedType = coin === "usdc" ? {
732
+ const wrappedType = coin === "usdc" || coin === "usdt" || coin === "eth" ? {
727
733
  from: "Wormhole",
728
734
  type: "Portal from Ethereum"
729
735
  } : void 0;
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 ];\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 ];\n\n if (coinType === wormHoleCoinTypes[0]) {\n return 'usdc';\n } else if (coinType === wormHoleCoinTypes[1]) {\n return 'usdt';\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'\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'\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 * @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"]}
package/dist/index.mjs CHANGED
@@ -514,7 +514,9 @@ var ScallopUtils = class {
514
514
  // USDC
515
515
  "0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf",
516
516
  // USDT
517
- "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c"
517
+ "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c",
518
+ // ETH
519
+ "0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5"
518
520
  ];
519
521
  if (wormHoleCoins.includes(coinPackageId)) {
520
522
  return `${coinPackageId}::coin::COIN`;
@@ -533,12 +535,16 @@ var ScallopUtils = class {
533
535
  // USDC
534
536
  "0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN",
535
537
  // USDT
536
- "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN"
538
+ "0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN",
539
+ // ETH
540
+ "0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN"
537
541
  ];
538
542
  if (coinType === wormHoleCoinTypes[0]) {
539
543
  return "usdc";
540
544
  } else if (coinType === wormHoleCoinTypes[1]) {
541
545
  return "usdt";
546
+ } else if (coinType === wormHoleCoinTypes[2]) {
547
+ return "eth";
542
548
  } else {
543
549
  return coinType.split("::")[2].toLowerCase();
544
550
  }
@@ -624,7 +630,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
624
630
  scallopAddress.get("core.packages.protocol.id"),
625
631
  coin
626
632
  );
627
- const wrappedType = coin === "usdc" ? {
633
+ const wrappedType = coin === "usdc" || coin === "usdt" || coin === "eth" ? {
628
634
  from: "Wormhole",
629
635
  type: "Portal from Ethereum"
630
636
  } : void 0;
@@ -681,7 +687,7 @@ var queryMarket = async (scallopAddress, suiKit, scallopUtils) => {
681
687
  coinType
682
688
  );
683
689
  const symbol = coin.toUpperCase();
684
- const wrappedType = coin === "usdc" ? {
690
+ const wrappedType = coin === "usdc" || coin === "usdt" || coin === "eth" ? {
685
691
  from: "Wormhole",
686
692
  type: "Portal from Ethereum"
687
693
  } : void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../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 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 ];\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 ];\n\n if (coinType === wormHoleCoinTypes[0]) {\n return 'usdc';\n } else if (coinType === wormHoleCoinTypes[1]) {\n return 'usdt';\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'\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'\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":["SuiKit","network","addresses","SuiKit","SuiTxBlock","SuiTxBlock","SUI_CLOCK_OBJECT_ID","SUI_CLOCK_OBJECT_ID","SuiKit","SuiKit"]}
1
+ {"version":3,"sources":["../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 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":";AAAO,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,SAAS,UAAAA,eAAc;;;ACAvB,OAAO,WAA8B;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,MAAM,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,SAAS,2BAA2B;AACpC,SAAS,UAAAC,eAAc;;;ACDvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,8BAA8B;AAehC,IAAM,eAAN,MAAmB;AAAA,EAGjB,YAAY,QAAuB;AACxC,SAAK,UAAU,IAAI,OAAO,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,YACX,OACA,QACA,WAAmB,cACnB;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,aAAO,mBAAmB,YAAY;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,wBAAwB;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,GAAG,sCAAsC;AAAA,EAClD;AACF;;;AC1IA,SAAiB,kBAAkB;AACnC,OAAO,eAAe;AAWf,IAAM,cAAc,OACzB,gBACA,QACA,iBACG;AACH,QAAM,YAAY,eAAe,IAAI,wBAAwB;AAC7D,QAAM,WAAW,eAAe,IAAI,aAAa;AACjD,QAAM,UAAU,IAAI,WAAW;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,kBAAkB,KAAK,MAAM;AACnC,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,0BAA0B,UAAU,cAAc,EACrD,aAAa,eAAe,EAC5B,UAAU,eAAe,EACzB,SAAS;AACZ,UAAM,gCAAgC,UAAU,oBAAoB,EACjE,aAAa,eAAe,EAC5B,UAAU,eAAe,EACzB,SAAS;AACZ,UAAM,+BAA+B,UAAU,mBAAmB,EAC/D,aAAa,eAAe,EAC5B,UAAU,eAAe,EACzB,SAAS;AACZ,UAAM,yBAAyB,UAAU,aAAa,EACnD,aAAa,eAAe,EAC5B,UAAU,eAAe,EACzB,SAAS;AACZ,UAAM,sBAAsB,UAAU,UAAU,EAC7C,aAAa,eAAe,EAC5B,UAAU,eAAe,EACzB,SAAS;AACZ,UAAM,YAAY,KAAK,OAAM,oBAAI,KAAK,GAAE,QAAQ,IAAI,GAAI,IAAI;AAC5D,UAAM,mBAAmB,UAAU,WAAW,EAC3C,aAAa,UAAU,SAAS,EAAE,aAAa,UAAU,CAAC,EAC1D,UAAU,eAAe;AAC5B,UAAM,qBAAqB,UAAU,WAAW,EAAE,KAAK,gBAAgB;AAEvE,UAAM,iBAAiB,UAAU,kBAAkB,EAChD,UAAU,WAAW,EACrB,MAAM,CAAC;AACV,UAAM,gBAAgB,UAAU,IAAI,EAAE,aAAa,cAAc;AACjE,UAAM,mBAAmB,cAAc,KAAK,IAAI;AAChD,UAAM,sBAAsB,UAAU,OAAO,EAAE;AAAA,MAC7C,cAAc,aAAa,aAAa;AAAA,IAC1C;AACA,UAAM,qBAAqB,UAAU,gBAAgB,EAAE;AAAA,MACrD,KAAK,IAAI,OAAO,oBAAoB,SAAS,GAAG,CAAC;AAAA,IACnD;AACA,QAAI,kBACF,UAAU,gBAAgB,EAAE,UAAU,kBAAkB;AAC1D,sBAAkB,gBAAgB,SAAS,IACvC,kBACA,UAAU,CAAC;AACf,QAAI,aAAa,UAAU,mBAAmB,EAC3C,aAAa,eAAe,EAC5B,aAAa,IAAI,aAAa;AACjC,iBAAa,WAAW,SAAS,IAAI,aAAa,UAAU,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;;;AClNA,SAAiB,cAAAC,mBAAkB;AAI5B,IAAM,kBAAkB,OAC7B,cACA,gBACA,WACG;AACH,QAAM,YAAY,eAAe,IAAI,wBAAwB;AAC7D,QAAM,cAAc,GAAG;AACvB,QAAM,UAAU,IAAIA,YAAW;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,SAAS,2BAA2B;AACpC,SAAS,cAAAC,mBAAkB;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,mBAAmB;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,mBAAmB;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,mBAAmB;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,mBAAmB;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,IAAIA,YAAW;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,SAAS,eAAe;AACxB,SAAS,uBAAAC,4BAAgD;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,SAASC,oBAAmB,GAAG,QAAQ;AAC5E,SAAO;AACT;AAaA,SAAS,iBACP,SACA,WACA,SACA,UACA,YACA,UACA;AACA,UAAQ;AAAA,IACN,GAAG;AAAA,IACH,CAAC,SAAS,UAAU,YAAYA,oBAAmB;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,YAAYA,oBAAmB;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,GAAG,QAAQ,YAAY,CAAC,CAAC;AAAA,MACvC;AAAA,MACAA;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,IAAIC,QAAO,MAAM;AAC/B,SAAK,UAAU;AACf,SAAK,gBAAgB;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,EAOA,MAAa,cAAc;AACzB,WAAO,YAAY,KAAK,SAAS,KAAK,QAAQ,KAAK,MAAM;AAAA,EAC3D;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;;;AFxbO,IAAM,UAAN,MAAc;AAAA,EAKZ,YAAY,QAAuB;AACxC,SAAK,SAAS;AACd,SAAK,SAAS,IAAIC,QAAO,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,IAAIA,QAAO,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":["SuiKit","network","addresses","SuiKit","SuiTxBlock","SuiTxBlock","SUI_CLOCK_OBJECT_ID","SUI_CLOCK_OBJECT_ID","SuiKit","SuiKit"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scallop-io/sui-scallop-sdk",
3
- "version": "0.37.6",
3
+ "version": "0.37.7",
4
4
  "description": "Tookit for interacting with Scallop on SUI",
5
5
  "keywords": [
6
6
  "sui",
@@ -79,6 +79,8 @@ export class ScallopUtils {
79
79
  '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',
80
80
  // USDT
81
81
  '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',
82
+ // ETH
83
+ '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',
82
84
  ];
83
85
  if (wormHoleCoins.includes(coinPackageId)) {
84
86
  return `${coinPackageId}::coin::COIN`;
@@ -99,12 +101,16 @@ export class ScallopUtils {
99
101
  '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',
100
102
  // USDT
101
103
  '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',
104
+ // ETH
105
+ '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',
102
106
  ];
103
107
 
104
108
  if (coinType === wormHoleCoinTypes[0]) {
105
109
  return 'usdc';
106
110
  } else if (coinType === wormHoleCoinTypes[1]) {
107
111
  return 'usdt';
112
+ } else if (coinType === wormHoleCoinTypes[2]) {
113
+ return 'eth';
108
114
  } else {
109
115
  return coinType.split('::')[2].toLowerCase() as SupportCoins;
110
116
  }
@@ -109,7 +109,7 @@ export const queryMarket = async (
109
109
  coin
110
110
  );
111
111
  const wrappedType =
112
- coin === 'usdc'
112
+ coin === 'usdc' || coin === 'usdt' || coin === 'eth'
113
113
  ? {
114
114
  from: 'Wormhole',
115
115
  type: 'Portal from Ethereum',
@@ -179,7 +179,7 @@ export const queryMarket = async (
179
179
  ) as SupportCollateralCoins;
180
180
  const symbol = coin.toUpperCase() as Uppercase<SupportCollateralCoins>;
181
181
  const wrappedType =
182
- coin === 'usdc'
182
+ coin === 'usdc' || coin === 'usdt' || coin === 'eth'
183
183
  ? {
184
184
  from: 'Wormhole',
185
185
  type: 'Portal from Ethereum',