diff --git a/src/contracts/services/moneyMarket.ts b/src/contracts/services/moneyMarket.ts index a6b67c8..9b3d952 100644 --- a/src/contracts/services/moneyMarket.ts +++ b/src/contracts/services/moneyMarket.ts @@ -16,10 +16,14 @@ import { BatchMoneyMarketConfigs, BatchMoneyMarketGetCollaterals, BatchMoneyMarketGetVaults, + BatchMoneyMarketPublicLiquidatable, + BatchMoneyMarketPrivateLiquidatable, ContractAndPagination, Pagination, ParsedConfigResponse, ParsedGetCollateralResponse, ParsedGetVaultsResponse, ParsedRewardPoolsResponse, RewardPoolResponse, + ParsedPaginatedPublicLiquidatable, + ParsedPaginatedPrivateLiquidatable, } from '~/types/contracts/moneyMarket/model'; import { Contract } from '~/types/contracts/shared/index'; import { MinBlockHeightValidationOptions } from '~/types'; @@ -83,7 +87,7 @@ const parseMoneyMarketGetVaults = ( */ const parseMoneyMarketConfig = ( response: ConfigResponse, -):ParsedConfigResponse => ({ +): ParsedConfigResponse => ({ adminAuth: { contractAddress: response.admin_auth.address, codeHash: response.admin_auth.code_hash, @@ -351,7 +355,7 @@ function batchQueryMoneyMarketConfig$({ batchSize, minBlockHeightValidationOptions, blockHeight, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -361,7 +365,7 @@ function batchQueryMoneyMarketConfig$({ minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, blockHeight?: number, }) { - const queries:BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ + const queries: BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ id: contract.address, contract: { address: contract.address, @@ -395,7 +399,7 @@ async function batchQueryMoneyMarketConfig({ chainId, moneyMarketContracts, minBlockHeightValidationOptions, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -439,7 +443,7 @@ function batchQueryMoneyMarketGetVaults$({ batchSize, minBlockHeightValidationOptions, blockHeight, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -449,7 +453,7 @@ function batchQueryMoneyMarketGetVaults$({ minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, blockHeight?: number, }) { - const queries:BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ + const queries: BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ id: contract.address, contract: { address: contract.address, @@ -489,7 +493,7 @@ async function batchQueryMoneyMarketGetVaults({ chainId, moneyMarketContracts, minBlockHeightValidationOptions, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -533,7 +537,7 @@ function batchQueryMoneyMarketGetCollateral$({ batchSize, minBlockHeightValidationOptions, blockHeight, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -543,7 +547,7 @@ function batchQueryMoneyMarketGetCollateral$({ minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, blockHeight?: number, }) { - const queries:BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ + const queries: BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ id: contract.address, contract: { address: contract.address, @@ -583,7 +587,7 @@ async function batchQueryMoneyMarketGetCollateral({ chainId, moneyMarketContracts, minBlockHeightValidationOptions, -}:{ +}: { queryRouterContractAddress: string, queryRouterCodeHash?: string, lcdEndpoint?: string, @@ -676,6 +680,333 @@ async function queryMoneyMarketPublicLogs({ })); } +const parsePublicLiquidatable = ( + response: any, +): ParsedPaginatedPublicLiquidatable => ({ + page: response.page, + pageSize: response.page_size, + totalPages: response.total_pages, + totalItems: response.total_items, + data: response.data.map(((item: any) => ({ + id: item.id, + collateral: item.collateral.map((collateral: any) => ({ + token: { + address: collateral.token.address, + codeHash: collateral.token.code_hash, + }, + liquidatableValue: collateral.liquidatable_value, + liquidatableAmount: collateral.liquidatable_amount, + liquidationDiscount: collateral.liquidation_discount, + price: collateral.price, + })), + debt: item.debt.map((debt: any) => ({ + token: { + address: debt.token.address, + codeHash: debt.token.code_hash, + }, + liquidatableValue: debt.liquidatable_value, + liquidatableAmount: debt.liquidatable_amount, + price: debt.price, + })), + }))), +}); + +/** + * Query the Public Logs for a single money market contract using RxJS + * NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY + */ +function queryMoneyMarketPublicLiquidatable$({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pagination, +}: { + contractAddress: string, + codeHash?: string, + lcdEndpoint?: string, + chainId?: string, + pagination?: Pagination, +}) { + return getActiveQueryClient$(lcdEndpoint, chainId).pipe( + switchMap(({ client }) => sendSecretClientContractQuery$({ + queryMsg: { + public_liquidatable: { pagination }, + }, + client, + contractAddress, + codeHash, + })), + map((response) => parsePublicLiquidatable(response)), + first(), + ); +} + +/** + * Query the Public Logs for a single money market contract + * NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY + */ +async function queryMoneyMarketPublicLiquidatable({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pageSize, + page, +}: { + contractAddress: string, + codeHash?: string, + lcdEndpoint?: string, + chainId?: string, + pageSize?: number, + page?: number, +}): Promise { + return lastValueFrom(queryMoneyMarketPublicLiquidatable$({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pagination: pageSize !== undefined && page !== undefined + ? { page_size: pageSize, page } + : undefined, + })); +} + +const parseBatchQueryMoneyMarketPublicLiquidatable = ( + responses: BatchQueryParsedResponse, +): BatchMoneyMarketPublicLiquidatable[] => ( + responses.map((response: BatchQueryParsedResponseItem) => ({ + moneyMarketContractAddress: response.id.toString(), + blockHeight: response.blockHeight, + public_liquidatable: response.response.map(parsePublicLiquidatable), + })) +); + +function batchQueryMoneyMarketPublicLiquidatable$({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + batchSize, + minBlockHeightValidationOptions, + blockHeight, +}: { + queryRouterContractAddress: string, + queryRouterCodeHash?: string, + lcdEndpoint?: string, + chainId?: string, + moneyMarketContracts: Contract[], + pagination?: Pagination, + batchSize?: number, + minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, + blockHeight?: number, +}) { + const queries: BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ + id: contract.address, + contract: { + address: contract.address, + codeHash: contract.codeHash, + }, + queryMsg: { public_liquidatable: { pagination } }, + })); + return batchQuery$({ + contractAddress: queryRouterContractAddress, + codeHash: queryRouterCodeHash, + lcdEndpoint, + chainId, + queries, + batchSize, + minBlockHeightValidationOptions, + blockHeight, + }).pipe( + map(parseBatchQueryMoneyMarketPublicLiquidatable), + first(), + ); +} + +async function batchQueryMoneyMarketPublicLiquidatable({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + minBlockHeightValidationOptions, +}: { + queryRouterContractAddress: string, + queryRouterCodeHash?: string, + lcdEndpoint?: string, + chainId?: string, + moneyMarketContracts: ContractAndPagination[], + pagination?: Pagination, + minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, +}) { + return lastValueFrom(batchQueryMoneyMarketPublicLiquidatable$({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + minBlockHeightValidationOptions, + })); +} + +const parsePrivateLiquidatable = ( + response: any, +): ParsedPaginatedPrivateLiquidatable => ({ + page: response.page, + pageSize: response.page_size, + totalPages: response.total_pages, + totalItems: response.total_items, + data: response.data, +}); + +/** + * Query the Public Logs for a single money market contract using RxJS + * NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY + */ +function queryMoneyMarketPrivateLiquidatable$({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pagination, +}: { + contractAddress: string, + codeHash?: string, + lcdEndpoint?: string, + chainId?: string, + pagination?: Pagination, +}) { + return getActiveQueryClient$(lcdEndpoint, chainId).pipe( + switchMap(({ client }) => sendSecretClientContractQuery$({ + queryMsg: { + private_liquidatable: { pagination }, + }, + client, + contractAddress, + codeHash, + })), + map((response) => parsePrivateLiquidatable(response)), + first(), + ); +} + +/** + * Query the Public Logs for a single money market contract + * NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY + */ +async function queryMoneyMarketPrivateLiquidatable({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pageSize, + page, +}: { + contractAddress: string, + codeHash?: string, + lcdEndpoint?: string, + chainId?: string, + pageSize?: number, + page?: number, +}) { + return lastValueFrom(queryMoneyMarketPrivateLiquidatable$({ + contractAddress, + codeHash, + lcdEndpoint, + chainId, + pagination: pageSize !== undefined && page !== undefined + ? { page_size: pageSize, page } + : undefined, + })); +} + +const parseBatchQueryMoneyMarketPrivateLiquidatable = ( + responses: BatchQueryParsedResponse, +): BatchMoneyMarketPrivateLiquidatable[] => ( + responses.map((response: BatchQueryParsedResponseItem) => ({ + moneyMarketContractAddress: response.id.toString(), + blockHeight: response.blockHeight, + private_liquidatable: response.response.map(parsePrivateLiquidatable), + })) +); + +function batchQueryMoneyMarketPrivateLiquidatable$({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + batchSize, + minBlockHeightValidationOptions, + blockHeight, +}: { + queryRouterContractAddress: string, + queryRouterCodeHash?: string, + lcdEndpoint?: string, + chainId?: string, + moneyMarketContracts: Contract[], + pagination?: Pagination, + batchSize?: number, + minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, + blockHeight?: number, +}) { + const queries: BatchQueryParams[] = moneyMarketContracts.map((contract) => ({ + id: contract.address, + contract: { + address: contract.address, + codeHash: contract.codeHash, + }, + queryMsg: { private_liquidatable: { pagination } }, + })); + return batchQuery$({ + contractAddress: queryRouterContractAddress, + codeHash: queryRouterCodeHash, + lcdEndpoint, + chainId, + queries, + batchSize, + minBlockHeightValidationOptions, + blockHeight, + }).pipe( + map(parseBatchQueryMoneyMarketPrivateLiquidatable), + first(), + ); +} + +async function batchQueryMoneyMarketPrivateLiquidatable({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + minBlockHeightValidationOptions, +}: { + queryRouterContractAddress: string, + queryRouterCodeHash?: string, + lcdEndpoint?: string, + chainId?: string, + moneyMarketContracts: ContractAndPagination[], + pagination?: Pagination, + minBlockHeightValidationOptions?: MinBlockHeightValidationOptions, +}) { + return lastValueFrom(batchQueryMoneyMarketPrivateLiquidatable$({ + queryRouterContractAddress, + queryRouterCodeHash, + lcdEndpoint, + chainId, + moneyMarketContracts, + pagination, + minBlockHeightValidationOptions, + })); +} + /** * Batch query the Public Logs for multiple money market contracts * NOT FOR PRODUCTION USE, CONTRACT IS IN DEVELOPMENT ON TESTNET ONLY @@ -863,6 +1194,14 @@ export { batchQueryMoneyMarketGetCollateral, queryMoneyMarketPublicLogs$, queryMoneyMarketPublicLogs, + queryMoneyMarketPublicLiquidatable$, + queryMoneyMarketPublicLiquidatable, + queryMoneyMarketPrivateLiquidatable$, + queryMoneyMarketPrivateLiquidatable, + batchQueryMoneyMarketPublicLiquidatable$, + batchQueryMoneyMarketPublicLiquidatable, + batchQueryMoneyMarketPrivateLiquidatable$, + batchQueryMoneyMarketPrivateLiquidatable, batchQueryMoneyMarketPublicLogs$, batchQueryMoneyMarketPublicLogs, batchQueryMoneyMarketRewardPools$, diff --git a/src/types/contracts/moneyMarket/model.ts b/src/types/contracts/moneyMarket/model.ts index c44b7cf..1e5f449 100644 --- a/src/types/contracts/moneyMarket/model.ts +++ b/src/types/contracts/moneyMarket/model.ts @@ -146,12 +146,12 @@ type BatchMoneyMarketGetCollateral = { type BatchMoneyMarketGetCollaterals = BatchMoneyMarketGetCollateral[]; type ParsedCalculatedUserCollateralResponse = { - [token: string]: { - token: string, - amount: string, - price: string, - value: string, - } + [token: string]: { + token: string, + amount: string, + price: string, + value: string, + } } type ParsedCalculatedUserDebtResponse = { @@ -191,27 +191,130 @@ type PaginatedPublicLogs = { } type RewardPool = { - rewardPoolId: string, - amount: string, - token: string, - start: string, - end: string, - rate: string, + rewardPoolId: string, + amount: string, + token: string, + start: string, + end: string, + rate: string, } type RewardPoolResponse = { - id: string, - amount: string, - token: string, - start: string, - end: string, - rate: string, + id: string, + amount: string, + token: string, + start: string, + end: string, + rate: string, } type ParsedRewardPoolsResponse = { - vault: string, - blockHeight: number, - rewardPools: RewardPool[], + vault: string, + blockHeight: number, + rewardPools: RewardPool[], +} + +type PublicLiquidatableUserCollateralResponse = { + token: { + address: string, + code_hash: string, + } + liquidatable_value: number, + liquidatable_amount: number, + liquidation_discount: number, + price: number, +} + +type ParsedPublicLiquidatableUserCollateral = { + token: { + address: string, + codeHash: string, + } + liquidatableValue: number, + liquidatableAmount: number, + liquidationDiscount: number, + price: number, +} + +type PublicLiquidatableUserDebtResponse = { + token: { + address: string, + code_hash: string, + }, + liquidatable_value: number, + liquidatable_amount: number, + price: number, +} + +type ParsedPublicLiquidatableUserDebt = { + token: { + address: string, + codeHash: string, + }, + liquidatableValue: number, + liquidatableAmount: number, + price: number, +} + +type PublicLiquidatableUserPositionResponse = { + id: number, + collateral: PublicLiquidatableUserCollateralResponse[], + debt: PublicLiquidatableUserDebtResponse[], +} + +type ParsedPublicLiquidatableUserPosition = { + id: number, + collateral: ParsedPublicLiquidatableUserCollateral[], + debt: ParsedPublicLiquidatableUserDebt[], +} + +type PaginatedPublicLiquidatableResponse = { + page: number, + page_size: number, + total_pages: number, + total_items: number, + data: PublicLiquidatableUserPositionResponse[], +} + +type ParsedPaginatedPublicLiquidatable = { + page: number, + pageSize: number, + totalPages: number, + totalItems: number, + data: ParsedPublicLiquidatableUserPosition[], +} + +type BatchMoneyMarketPublicLiquidatable = { + moneyMarketContractAddress: string, + public_liquidatable: ParsedPaginatedPublicLiquidatable, + blockHeight: number, +} + +type PrivateLiquidatableUserPosition = { + id: number, + routes: number, +} + +type PaginatedPrivateLiquidatableResponse = { + page: number, + page_size: number, + total_pages: number, + total_items: number, + data: PrivateLiquidatableUserPosition[], +} + +type ParsedPaginatedPrivateLiquidatable = { + page: number, + pageSize: number, + totalPages: number, + totalItems: number, + data: PrivateLiquidatableUserPosition[], +} + +type BatchMoneyMarketPrivateLiquidatable = { + moneyMarketContractAddress: string, + private_liquidatable: ParsedPaginatedPrivateLiquidatable, + blockHeight: number, } export type { @@ -232,4 +335,17 @@ export type { RewardPool, RewardPoolResponse, ParsedRewardPoolsResponse, + PublicLiquidatableUserCollateralResponse, + ParsedPublicLiquidatableUserCollateral, + PublicLiquidatableUserDebtResponse, + ParsedPublicLiquidatableUserDebt, + PublicLiquidatableUserPositionResponse, + ParsedPublicLiquidatableUserPosition, + PaginatedPublicLiquidatableResponse, + ParsedPaginatedPublicLiquidatable, + BatchMoneyMarketPublicLiquidatable, + PrivateLiquidatableUserPosition, + PaginatedPrivateLiquidatableResponse, + ParsedPaginatedPrivateLiquidatable, + BatchMoneyMarketPrivateLiquidatable, };