Mp 2836 implement pagination to the batched smart contract queries (#301)
* feat: batch and paginate oracle prices * fixes and improvements * feat: complete batching mechanism and its implementation * fix: getVaultConfigs usage * fix: linting * feat: remove hardcoded mars decimals
This commit is contained in:
parent
48d07173fb
commit
49e7778b1e
@ -42,5 +42,5 @@ NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmos
|
|||||||
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
|
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
|
||||||
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
|
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
|
||||||
# CHARTING_LIBRARY_REPOSITORY="username/charting_library"
|
# CHARTING_LIBRARY_REPOSITORY="username/charting_library"
|
||||||
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api/
|
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
|
||||||
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
||||||
|
@ -4,7 +4,7 @@ import { ENV } from 'constants/env'
|
|||||||
import { MarsAccountNftQueryClient } from 'types/generated/mars-account-nft/MarsAccountNft.client'
|
import { MarsAccountNftQueryClient } from 'types/generated/mars-account-nft/MarsAccountNft.client'
|
||||||
import { MarsCreditManagerQueryClient } from 'types/generated/mars-credit-manager/MarsCreditManager.client'
|
import { MarsCreditManagerQueryClient } from 'types/generated/mars-credit-manager/MarsCreditManager.client'
|
||||||
import { MarsIncentivesQueryClient } from 'types/generated/mars-incentives/MarsIncentives.client'
|
import { MarsIncentivesQueryClient } from 'types/generated/mars-incentives/MarsIncentives.client'
|
||||||
import { MarsMockOracleQueryClient } from 'types/generated/mars-mock-oracle/MarsMockOracle.client'
|
import { MarsOracleOsmosisQueryClient } from 'types/generated/mars-oracle-osmosis/MarsOracleOsmosis.client'
|
||||||
import { MarsMockRedBankQueryClient } from 'types/generated/mars-mock-red-bank/MarsMockRedBank.client'
|
import { MarsMockRedBankQueryClient } from 'types/generated/mars-mock-red-bank/MarsMockRedBank.client'
|
||||||
import { MarsMockVaultQueryClient } from 'types/generated/mars-mock-vault/MarsMockVault.client'
|
import { MarsMockVaultQueryClient } from 'types/generated/mars-mock-vault/MarsMockVault.client'
|
||||||
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
|
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
|
||||||
@ -12,7 +12,7 @@ import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.cl
|
|||||||
let _cosmWasmClient: CosmWasmClient
|
let _cosmWasmClient: CosmWasmClient
|
||||||
let _accountNftQueryClient: MarsAccountNftQueryClient
|
let _accountNftQueryClient: MarsAccountNftQueryClient
|
||||||
let _creditManagerQueryClient: MarsCreditManagerQueryClient
|
let _creditManagerQueryClient: MarsCreditManagerQueryClient
|
||||||
let _oracleQueryClient: MarsMockOracleQueryClient
|
let _oracleQueryClient: MarsOracleOsmosisQueryClient
|
||||||
let _redBankQueryClient: MarsMockRedBankQueryClient
|
let _redBankQueryClient: MarsMockRedBankQueryClient
|
||||||
let _paramsQueryClient: MarsParamsQueryClient
|
let _paramsQueryClient: MarsParamsQueryClient
|
||||||
let _incentivesQueryClient: MarsIncentivesQueryClient
|
let _incentivesQueryClient: MarsIncentivesQueryClient
|
||||||
@ -75,7 +75,7 @@ const getOracleQueryClient = async () => {
|
|||||||
try {
|
try {
|
||||||
if (!_oracleQueryClient) {
|
if (!_oracleQueryClient) {
|
||||||
const client = await getClient()
|
const client = await getClient()
|
||||||
_oracleQueryClient = new MarsMockOracleQueryClient(client, ENV.ADDRESS_ORACLE)
|
_oracleQueryClient = new MarsOracleOsmosisQueryClient(client, ENV.ADDRESS_ORACLE)
|
||||||
}
|
}
|
||||||
|
|
||||||
return _oracleQueryClient
|
return _oracleQueryClient
|
||||||
|
@ -6,7 +6,7 @@ import { SECONDS_IN_A_YEAR } from 'utils/constants'
|
|||||||
import getPrice from 'api/prices/getPrice'
|
import getPrice from 'api/prices/getPrice'
|
||||||
import getMarsPrice from 'api/prices/getMarsPrice'
|
import getMarsPrice from 'api/prices/getMarsPrice'
|
||||||
import { ASSETS } from 'constants/assets'
|
import { ASSETS } from 'constants/assets'
|
||||||
import { byDenom } from 'utils/array'
|
import { byDenom, bySymbol } from 'utils/array'
|
||||||
|
|
||||||
export default async function calculateAssetIncentivesApy(
|
export default async function calculateAssetIncentivesApy(
|
||||||
denom: string,
|
denom: string,
|
||||||
@ -16,17 +16,15 @@ export default async function calculateAssetIncentivesApy(
|
|||||||
|
|
||||||
if (!assetIncentive) return null
|
if (!assetIncentive) return null
|
||||||
|
|
||||||
const [marketLiquidityAmount, assetPriceResponse, marsPrice] = await Promise.all([
|
const [marketLiquidityAmount, assetPrice, marsPrice] = await Promise.all([
|
||||||
getUnderlyingLiquidityAmount(market),
|
getUnderlyingLiquidityAmount(market),
|
||||||
getPrice(denom),
|
getPrice(denom),
|
||||||
getMarsPrice(),
|
getMarsPrice(),
|
||||||
])
|
])
|
||||||
|
|
||||||
const assetDecimals = (ASSETS.find(byDenom(denom)) as Asset).decimals
|
const assetDecimals = (ASSETS.find(byDenom(denom)) as Asset).decimals
|
||||||
const marsDecimals = 6,
|
const marsDecimals = (ASSETS.find(bySymbol('MARS')) as Asset).decimals
|
||||||
priceFeedDecimals = 6
|
|
||||||
|
|
||||||
const assetPrice = BN(assetPriceResponse).shiftedBy(assetDecimals - priceFeedDecimals)
|
|
||||||
const marketLiquidityValue = BN(marketLiquidityAmount)
|
const marketLiquidityValue = BN(marketLiquidityAmount)
|
||||||
.shiftedBy(-assetDecimals)
|
.shiftedBy(-assetDecimals)
|
||||||
.multipliedBy(assetPrice)
|
.multipliedBy(assetPrice)
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { ENV } from 'constants/env'
|
|
||||||
import { resolveMarketResponse } from 'utils/resolvers'
|
import { resolveMarketResponse } from 'utils/resolvers'
|
||||||
import { getClient, getRedBankQueryClient } from 'api/cosmwasm-client'
|
import { getRedBankQueryClient } from 'api/cosmwasm-client'
|
||||||
|
|
||||||
export default async function getMarket(denom: string): Promise<Market> {
|
export default async function getMarket(denom: string): Promise<Market> {
|
||||||
try {
|
try {
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
import { getEnabledMarketAssets } from 'utils/assets'
|
import { getEnabledMarketAssets } from 'utils/assets'
|
||||||
import getMarket from 'api/markets/getMarket'
|
import { getRedBankQueryClient } from 'api/cosmwasm-client'
|
||||||
|
import iterateContractQuery from 'utils/iterateContractQuery'
|
||||||
|
import { byDenom } from 'utils/array'
|
||||||
|
import { resolveMarketResponse } from 'utils/resolvers'
|
||||||
|
import { Market as RedBankMarket } from 'types/generated/mars-mock-red-bank/MarsMockRedBank.types'
|
||||||
|
|
||||||
export default async function getMarkets(): Promise<Market[]> {
|
export default async function getMarkets(): Promise<Market[]> {
|
||||||
try {
|
try {
|
||||||
|
const client = await getRedBankQueryClient()
|
||||||
const enabledAssets = getEnabledMarketAssets()
|
const enabledAssets = getEnabledMarketAssets()
|
||||||
const marketQueries = enabledAssets.map((asset) => getMarket(asset.denom))
|
|
||||||
|
|
||||||
return await Promise.all(marketQueries)
|
const markets = await iterateContractQuery(client.markets)
|
||||||
|
|
||||||
|
return enabledAssets.map((asset) =>
|
||||||
|
resolveMarketResponse(markets.find(byDenom(asset.denom)) as RedBankMarket),
|
||||||
|
)
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
throw ex
|
throw ex
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,26 @@
|
|||||||
import { getOracleQueryClient } from 'api/cosmwasm-client'
|
import { getOracleQueryClient } from 'api/cosmwasm-client'
|
||||||
|
import { PRICE_ORACLE_DECIMALS } from 'constants/query'
|
||||||
import { BNCoin } from 'types/classes/BNCoin'
|
import { BNCoin } from 'types/classes/BNCoin'
|
||||||
|
import { PriceResponse } from 'types/generated/mars-oracle-osmosis/MarsOracleOsmosis.types'
|
||||||
|
import { byDenom } from 'utils/array'
|
||||||
import { BN } from 'utils/helpers'
|
import { BN } from 'utils/helpers'
|
||||||
|
import iterateContractQuery from 'utils/iterateContractQuery'
|
||||||
|
|
||||||
export default async function getOraclePrices(...assets: Asset[]): Promise<BNCoin[]> {
|
export default async function getOraclePrices(...assets: Asset[]): Promise<BNCoin[]> {
|
||||||
try {
|
try {
|
||||||
const baseDecimals = 6
|
if (!assets.length) return []
|
||||||
|
|
||||||
const oracleQueryClient = await getOracleQueryClient()
|
const oracleQueryClient = await getOracleQueryClient()
|
||||||
|
const priceResults = await iterateContractQuery(oracleQueryClient.prices)
|
||||||
|
|
||||||
const priceQueries = assets.map((asset) =>
|
return assets.map((asset) => {
|
||||||
oracleQueryClient.price({
|
const priceResponse = priceResults.find(byDenom(asset.denom)) as PriceResponse
|
||||||
denom: asset.denom,
|
const decimalDiff = asset.decimals - PRICE_ORACLE_DECIMALS
|
||||||
}),
|
|
||||||
|
return BNCoin.fromDenomAndBigNumber(
|
||||||
|
asset.denom,
|
||||||
|
BN(priceResponse.price).shiftedBy(decimalDiff),
|
||||||
)
|
)
|
||||||
const priceResults = await Promise.all(priceQueries)
|
|
||||||
|
|
||||||
return priceResults.map(({ denom, price }, index) => {
|
|
||||||
const decimalDiff = assets[index].decimals - baseDecimals
|
|
||||||
return BNCoin.fromDenomAndBigNumber(denom, BN(price).shiftedBy(decimalDiff))
|
|
||||||
})
|
})
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
throw ex
|
throw ex
|
||||||
|
@ -4,6 +4,7 @@ import { byDenom } from 'utils/array'
|
|||||||
import getPythPrice from 'api/prices/getPythPrices'
|
import getPythPrice from 'api/prices/getPythPrices'
|
||||||
import getPoolPrice from 'api/prices/getPoolPrice'
|
import getPoolPrice from 'api/prices/getPoolPrice'
|
||||||
import { BN } from 'utils/helpers'
|
import { BN } from 'utils/helpers'
|
||||||
|
import { PRICE_ORACLE_DECIMALS } from 'constants/query'
|
||||||
|
|
||||||
export default async function getPrice(denom: string): Promise<BigNumber> {
|
export default async function getPrice(denom: string): Promise<BigNumber> {
|
||||||
try {
|
try {
|
||||||
@ -16,8 +17,9 @@ export default async function getPrice(denom: string): Promise<BigNumber> {
|
|||||||
if (asset.hasOraclePrice) {
|
if (asset.hasOraclePrice) {
|
||||||
const oracleQueryClient = await getOracleQueryClient()
|
const oracleQueryClient = await getOracleQueryClient()
|
||||||
const priceResponse = await oracleQueryClient.price({ denom: asset.denom })
|
const priceResponse = await oracleQueryClient.price({ denom: asset.denom })
|
||||||
|
const decimalDiff = asset.decimals - PRICE_ORACLE_DECIMALS
|
||||||
|
|
||||||
return BN(priceResponse.price)
|
return BN(priceResponse.price).shiftedBy(decimalDiff)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (asset.poolId) {
|
if (asset.poolId) {
|
||||||
|
@ -1,27 +1,13 @@
|
|||||||
import { getParamsQueryClient } from 'api/cosmwasm-client'
|
import { getParamsQueryClient } from 'api/cosmwasm-client'
|
||||||
import { ENV } from 'constants/env'
|
import { VaultConfigBaseForAddr } from 'types/generated/mars-params/MarsParams.types'
|
||||||
import { VaultConfigBaseForString } from 'types/generated/mars-params/MarsParams.types'
|
import iterateContractQuery from 'utils/iterateContractQuery'
|
||||||
|
|
||||||
export const getVaultConfigs = async (
|
export const getVaultConfigs = async (): Promise<VaultConfigBaseForAddr[]> => {
|
||||||
vaultConfigs: VaultConfigBaseForString[],
|
|
||||||
startAfter?: string,
|
|
||||||
): Promise<VaultConfigBaseForString[]> => {
|
|
||||||
if (!ENV.ADDRESS_PARAMS) return []
|
|
||||||
const paramsQueryClient = await getParamsQueryClient()
|
|
||||||
try {
|
try {
|
||||||
const batch = await paramsQueryClient.allVaultConfigs({
|
const paramsQueryClient = await getParamsQueryClient()
|
||||||
limit: 4,
|
return await iterateContractQuery(paramsQueryClient.allVaultConfigs, 'addr')
|
||||||
startAfter,
|
} catch (ex) {
|
||||||
})
|
console.error(ex)
|
||||||
|
throw ex
|
||||||
vaultConfigs.push(...batch)
|
|
||||||
|
|
||||||
if (batch.length === 4) {
|
|
||||||
return await getVaultConfigs(vaultConfigs, batch[batch.length - 1].addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return vaultConfigs
|
|
||||||
} catch {
|
|
||||||
return vaultConfigs
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import { TESTNET_VAULTS_META_DATA, VAULTS_META_DATA } from 'constants/vaults'
|
|||||||
import { BN } from 'utils/helpers'
|
import { BN } from 'utils/helpers'
|
||||||
|
|
||||||
export default async function getVaults(): Promise<Vault[]> {
|
export default async function getVaults(): Promise<Vault[]> {
|
||||||
const vaultConfigs = await getVaultConfigs([])
|
const vaultConfigs = await getVaultConfigs()
|
||||||
const $vaultUtilizations = getVaultUtilizations(vaultConfigs)
|
const $vaultUtilizations = getVaultUtilizations(vaultConfigs)
|
||||||
const $aprs = getAprs()
|
const $aprs = getAprs()
|
||||||
const vaultMetaDatas = ENV.NETWORK === 'testnet' ? TESTNET_VAULTS_META_DATA : VAULTS_META_DATA
|
const vaultMetaDatas = ENV.NETWORK === 'testnet' ? TESTNET_VAULTS_META_DATA : VAULTS_META_DATA
|
||||||
|
@ -37,13 +37,13 @@ function Benefits({ benefits }: BenefitsProps) {
|
|||||||
|
|
||||||
export default function TermsOfService() {
|
export default function TermsOfService() {
|
||||||
const { connect } = useWalletManager()
|
const { connect } = useWalletManager()
|
||||||
const [hasAgreedToTerms, setHasAgreedToTerms] = useLocalStorage(TERMS_OF_SERVICE_KEY, false)
|
const [_, setHasAgreedToTerms] = useLocalStorage(TERMS_OF_SERVICE_KEY, false)
|
||||||
|
|
||||||
const handleAgreeTermsOfService = useCallback(() => {
|
const handleAgreeTermsOfService = useCallback(() => {
|
||||||
useStore.setState({ showTermsOfService: false, isFocusMode: false })
|
useStore.setState({ showTermsOfService: false, isFocusMode: false })
|
||||||
setHasAgreedToTerms(true)
|
setHasAgreedToTerms(true)
|
||||||
connect()
|
connect()
|
||||||
}, [connect, hasAgreedToTerms, setHasAgreedToTerms])
|
}, [connect, setHasAgreedToTerms])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='relative flex h-full w-full items-center justify-center'>
|
<div className='relative flex h-full w-full items-center justify-center'>
|
||||||
|
2
src/constants/query.ts
Normal file
2
src/constants/query.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export const ITEM_LIMIT_PER_QUERY = 10
|
||||||
|
export const PRICE_ORACLE_DECIMALS = 6
|
@ -1,99 +0,0 @@
|
|||||||
// @ts-nocheck
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.1.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
||||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { CosmWasmClient, ExecuteResult, SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate'
|
|
||||||
import { Coin, StdFee } from '@cosmjs/amino'
|
|
||||||
|
|
||||||
import {
|
|
||||||
CoinPrice,
|
|
||||||
Decimal,
|
|
||||||
ExecuteMsg,
|
|
||||||
InstantiateMsg,
|
|
||||||
PriceResponse,
|
|
||||||
QueryMsg,
|
|
||||||
} from './MarsMockOracle.types'
|
|
||||||
export interface MarsMockOracleReadOnlyInterface {
|
|
||||||
contractAddress: string
|
|
||||||
price: ({ denom }: { denom: string }) => Promise<PriceResponse>
|
|
||||||
}
|
|
||||||
export class MarsMockOracleQueryClient implements MarsMockOracleReadOnlyInterface {
|
|
||||||
client: CosmWasmClient
|
|
||||||
contractAddress: string
|
|
||||||
|
|
||||||
constructor(client: CosmWasmClient, contractAddress: string) {
|
|
||||||
this.client = client
|
|
||||||
this.contractAddress = contractAddress
|
|
||||||
this.price = this.price.bind(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
price = async ({ denom }: { denom: string }): Promise<PriceResponse> => {
|
|
||||||
return this.client.queryContractSmart(this.contractAddress, {
|
|
||||||
price: {
|
|
||||||
denom,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export interface MarsMockOracleInterface extends MarsMockOracleReadOnlyInterface {
|
|
||||||
contractAddress: string
|
|
||||||
sender: string
|
|
||||||
changePrice: (
|
|
||||||
{
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
}: {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
},
|
|
||||||
fee?: number | StdFee | 'auto',
|
|
||||||
memo?: string,
|
|
||||||
_funds?: Coin[],
|
|
||||||
) => Promise<ExecuteResult>
|
|
||||||
}
|
|
||||||
export class MarsMockOracleClient
|
|
||||||
extends MarsMockOracleQueryClient
|
|
||||||
implements MarsMockOracleInterface
|
|
||||||
{
|
|
||||||
client: SigningCosmWasmClient
|
|
||||||
sender: string
|
|
||||||
contractAddress: string
|
|
||||||
|
|
||||||
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
|
||||||
super(client, contractAddress)
|
|
||||||
this.client = client
|
|
||||||
this.sender = sender
|
|
||||||
this.contractAddress = contractAddress
|
|
||||||
this.changePrice = this.changePrice.bind(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
changePrice = async (
|
|
||||||
{
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
}: {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
},
|
|
||||||
fee: number | StdFee | 'auto' = 'auto',
|
|
||||||
memo?: string,
|
|
||||||
_funds?: Coin[],
|
|
||||||
): Promise<ExecuteResult> => {
|
|
||||||
return await this.client.execute(
|
|
||||||
this.sender,
|
|
||||||
this.contractAddress,
|
|
||||||
{
|
|
||||||
change_price: {
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
fee,
|
|
||||||
memo,
|
|
||||||
_funds,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
// @ts-nocheck
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.1.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
||||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { Coin } from '@cosmjs/amino'
|
|
||||||
import { MsgExecuteContractEncodeObject } from '@cosmjs/cosmwasm-stargate'
|
|
||||||
import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx'
|
|
||||||
import { toUtf8 } from '@cosmjs/encoding'
|
|
||||||
|
|
||||||
import {
|
|
||||||
CoinPrice,
|
|
||||||
Decimal,
|
|
||||||
ExecuteMsg,
|
|
||||||
InstantiateMsg,
|
|
||||||
PriceResponse,
|
|
||||||
QueryMsg,
|
|
||||||
} from './MarsMockOracle.types'
|
|
||||||
export interface MarsMockOracleMessage {
|
|
||||||
contractAddress: string
|
|
||||||
sender: string
|
|
||||||
changePrice: (
|
|
||||||
{
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
}: {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
},
|
|
||||||
_funds?: Coin[],
|
|
||||||
) => MsgExecuteContractEncodeObject
|
|
||||||
}
|
|
||||||
export class MarsMockOracleMessageComposer implements MarsMockOracleMessage {
|
|
||||||
sender: string
|
|
||||||
contractAddress: string
|
|
||||||
|
|
||||||
constructor(sender: string, contractAddress: string) {
|
|
||||||
this.sender = sender
|
|
||||||
this.contractAddress = contractAddress
|
|
||||||
this.changePrice = this.changePrice.bind(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
changePrice = (
|
|
||||||
{
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
}: {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
},
|
|
||||||
_funds?: Coin[],
|
|
||||||
): MsgExecuteContractEncodeObject => {
|
|
||||||
return {
|
|
||||||
typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract',
|
|
||||||
value: MsgExecuteContract.fromPartial({
|
|
||||||
sender: this.sender,
|
|
||||||
contract: this.contractAddress,
|
|
||||||
msg: toUtf8(
|
|
||||||
JSON.stringify({
|
|
||||||
change_price: {
|
|
||||||
denom,
|
|
||||||
price,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
funds: _funds,
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,85 +0,0 @@
|
|||||||
// @ts-nocheck
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.1.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
||||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { useMutation, UseMutationOptions, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
|
||||||
import { ExecuteResult } from '@cosmjs/cosmwasm-stargate'
|
|
||||||
import { Coin, StdFee } from '@cosmjs/amino'
|
|
||||||
|
|
||||||
import {
|
|
||||||
CoinPrice,
|
|
||||||
Decimal,
|
|
||||||
ExecuteMsg,
|
|
||||||
InstantiateMsg,
|
|
||||||
PriceResponse,
|
|
||||||
QueryMsg,
|
|
||||||
} from './MarsMockOracle.types'
|
|
||||||
import { MarsMockOracleClient, MarsMockOracleQueryClient } from './MarsMockOracle.client'
|
|
||||||
export const marsMockOracleQueryKeys = {
|
|
||||||
contract: [
|
|
||||||
{
|
|
||||||
contract: 'marsMockOracle',
|
|
||||||
},
|
|
||||||
] as const,
|
|
||||||
address: (contractAddress: string | undefined) =>
|
|
||||||
[{ ...marsMockOracleQueryKeys.contract[0], address: contractAddress }] as const,
|
|
||||||
price: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
|
||||||
[{ ...marsMockOracleQueryKeys.address(contractAddress)[0], method: 'price', args }] as const,
|
|
||||||
}
|
|
||||||
export interface MarsMockOracleReactQuery<TResponse, TData = TResponse> {
|
|
||||||
client: MarsMockOracleQueryClient | undefined
|
|
||||||
options?: Omit<
|
|
||||||
UseQueryOptions<TResponse, Error, TData>,
|
|
||||||
"'queryKey' | 'queryFn' | 'initialData'"
|
|
||||||
> & {
|
|
||||||
initialData?: undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export interface MarsMockOraclePriceQuery<TData>
|
|
||||||
extends MarsMockOracleReactQuery<PriceResponse, TData> {
|
|
||||||
args: {
|
|
||||||
denom: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export function useMarsMockOraclePriceQuery<TData = PriceResponse>({
|
|
||||||
client,
|
|
||||||
args,
|
|
||||||
options,
|
|
||||||
}: MarsMockOraclePriceQuery<TData>) {
|
|
||||||
return useQuery<PriceResponse, Error, TData>(
|
|
||||||
marsMockOracleQueryKeys.price(client?.contractAddress, args),
|
|
||||||
() =>
|
|
||||||
client
|
|
||||||
? client.price({
|
|
||||||
denom: args.denom,
|
|
||||||
})
|
|
||||||
: Promise.reject(new Error('Invalid client')),
|
|
||||||
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
export interface MarsMockOracleChangePriceMutation {
|
|
||||||
client: MarsMockOracleClient
|
|
||||||
msg: {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
}
|
|
||||||
args?: {
|
|
||||||
fee?: number | StdFee | 'auto'
|
|
||||||
memo?: string
|
|
||||||
funds?: Coin[]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export function useMarsMockOracleChangePriceMutation(
|
|
||||||
options?: Omit<
|
|
||||||
UseMutationOptions<ExecuteResult, Error, MarsMockOracleChangePriceMutation>,
|
|
||||||
'mutationFn'
|
|
||||||
>,
|
|
||||||
) {
|
|
||||||
return useMutation<ExecuteResult, Error, MarsMockOracleChangePriceMutation>(
|
|
||||||
({ client, msg, args: { fee, memo, funds } = {} }) => client.changePrice(msg, fee, memo, funds),
|
|
||||||
options,
|
|
||||||
)
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
// @ts-nocheck
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.1.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
||||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export type Decimal = string
|
|
||||||
export interface InstantiateMsg {
|
|
||||||
prices: CoinPrice[]
|
|
||||||
}
|
|
||||||
export interface CoinPrice {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
}
|
|
||||||
export type ExecuteMsg = {
|
|
||||||
change_price: CoinPrice
|
|
||||||
}
|
|
||||||
export type QueryMsg = {
|
|
||||||
price: {
|
|
||||||
denom: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export interface PriceResponse {
|
|
||||||
denom: string
|
|
||||||
price: Decimal
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
// @ts-nocheck
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.1.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
||||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as _12 from './MarsMockOracle.types'
|
|
||||||
import * as _13 from './MarsMockOracle.client'
|
|
||||||
import * as _14 from './MarsMockOracle.message-composer'
|
|
||||||
import * as _15 from './MarsMockOracle.react-query'
|
|
||||||
export namespace contracts {
|
|
||||||
export const MarsMockOracle = { ..._12, ..._13, ..._14, ..._15 }
|
|
||||||
}
|
|
@ -0,0 +1,260 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
/**
|
||||||
|
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.0.
|
||||||
|
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||||
|
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate'
|
||||||
|
import { Coin, StdFee } from '@cosmjs/amino'
|
||||||
|
import {
|
||||||
|
InstantiateMsg,
|
||||||
|
ExecuteMsg,
|
||||||
|
OsmosisPriceSourceForString,
|
||||||
|
Decimal,
|
||||||
|
Downtime,
|
||||||
|
Identifier,
|
||||||
|
OwnerUpdate,
|
||||||
|
DowntimeDetector,
|
||||||
|
GeometricTwap,
|
||||||
|
RedemptionRateForString,
|
||||||
|
QueryMsg,
|
||||||
|
ConfigResponse,
|
||||||
|
PriceResponse,
|
||||||
|
PriceSourceResponseForString,
|
||||||
|
ArrayOfPriceSourceResponseForString,
|
||||||
|
ArrayOfPriceResponse,
|
||||||
|
} from './MarsOracleOsmosis.types'
|
||||||
|
export interface MarsOracleOsmosisReadOnlyInterface {
|
||||||
|
contractAddress: string
|
||||||
|
config: () => Promise<ConfigResponse>
|
||||||
|
priceSource: ({ denom }: { denom: string }) => Promise<PriceSourceResponseForString>
|
||||||
|
priceSources: ({
|
||||||
|
limit,
|
||||||
|
startAfter,
|
||||||
|
}: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}) => Promise<ArrayOfPriceSourceResponseForString>
|
||||||
|
price: ({ denom }: { denom: string }) => Promise<PriceResponse>
|
||||||
|
prices: ({
|
||||||
|
limit,
|
||||||
|
startAfter,
|
||||||
|
}: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}) => Promise<ArrayOfPriceResponse>
|
||||||
|
}
|
||||||
|
export class MarsOracleOsmosisQueryClient implements MarsOracleOsmosisReadOnlyInterface {
|
||||||
|
client: CosmWasmClient
|
||||||
|
contractAddress: string
|
||||||
|
|
||||||
|
constructor(client: CosmWasmClient, contractAddress: string) {
|
||||||
|
this.client = client
|
||||||
|
this.contractAddress = contractAddress
|
||||||
|
this.config = this.config.bind(this)
|
||||||
|
this.priceSource = this.priceSource.bind(this)
|
||||||
|
this.priceSources = this.priceSources.bind(this)
|
||||||
|
this.price = this.price.bind(this)
|
||||||
|
this.prices = this.prices.bind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
config = async (): Promise<ConfigResponse> => {
|
||||||
|
return this.client.queryContractSmart(this.contractAddress, {
|
||||||
|
config: {},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
priceSource = async ({ denom }: { denom: string }): Promise<PriceSourceResponseForString> => {
|
||||||
|
return this.client.queryContractSmart(this.contractAddress, {
|
||||||
|
price_source: {
|
||||||
|
denom,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
priceSources = async ({
|
||||||
|
limit,
|
||||||
|
startAfter,
|
||||||
|
}: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}): Promise<ArrayOfPriceSourceResponseForString> => {
|
||||||
|
return this.client.queryContractSmart(this.contractAddress, {
|
||||||
|
price_sources: {
|
||||||
|
limit,
|
||||||
|
start_after: startAfter,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
price = async ({ denom }: { denom: string }): Promise<PriceResponse> => {
|
||||||
|
return this.client.queryContractSmart(this.contractAddress, {
|
||||||
|
price: {
|
||||||
|
denom,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
prices = async ({
|
||||||
|
limit,
|
||||||
|
startAfter,
|
||||||
|
}: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}): Promise<ArrayOfPriceResponse> => {
|
||||||
|
return this.client.queryContractSmart(this.contractAddress, {
|
||||||
|
prices: {
|
||||||
|
limit,
|
||||||
|
start_after: startAfter,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisInterface extends MarsOracleOsmosisReadOnlyInterface {
|
||||||
|
contractAddress: string
|
||||||
|
sender: string
|
||||||
|
setPriceSource: (
|
||||||
|
{
|
||||||
|
denom,
|
||||||
|
priceSource,
|
||||||
|
}: {
|
||||||
|
denom: string
|
||||||
|
priceSource: OsmosisPriceSourceForString
|
||||||
|
},
|
||||||
|
fee?: number | StdFee | 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
) => Promise<ExecuteResult>
|
||||||
|
removePriceSource: (
|
||||||
|
{
|
||||||
|
denom,
|
||||||
|
}: {
|
||||||
|
denom: string
|
||||||
|
},
|
||||||
|
fee?: number | StdFee | 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
) => Promise<ExecuteResult>
|
||||||
|
updateOwner: (
|
||||||
|
ownerUpdate: OwnerUpdate,
|
||||||
|
fee?: number | StdFee | 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
) => Promise<ExecuteResult>
|
||||||
|
updateConfig: (
|
||||||
|
{
|
||||||
|
baseDenom,
|
||||||
|
}: {
|
||||||
|
baseDenom?: string
|
||||||
|
},
|
||||||
|
fee?: number | StdFee | 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
) => Promise<ExecuteResult>
|
||||||
|
}
|
||||||
|
export class MarsOracleOsmosisClient
|
||||||
|
extends MarsOracleOsmosisQueryClient
|
||||||
|
implements MarsOracleOsmosisInterface
|
||||||
|
{
|
||||||
|
client: SigningCosmWasmClient
|
||||||
|
sender: string
|
||||||
|
contractAddress: string
|
||||||
|
|
||||||
|
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||||
|
super(client, contractAddress)
|
||||||
|
this.client = client
|
||||||
|
this.sender = sender
|
||||||
|
this.contractAddress = contractAddress
|
||||||
|
this.setPriceSource = this.setPriceSource.bind(this)
|
||||||
|
this.removePriceSource = this.removePriceSource.bind(this)
|
||||||
|
this.updateOwner = this.updateOwner.bind(this)
|
||||||
|
this.updateConfig = this.updateConfig.bind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
setPriceSource = async (
|
||||||
|
{
|
||||||
|
denom,
|
||||||
|
priceSource,
|
||||||
|
}: {
|
||||||
|
denom: string
|
||||||
|
priceSource: OsmosisPriceSourceForString
|
||||||
|
},
|
||||||
|
fee: number | StdFee | 'auto' = 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
): Promise<ExecuteResult> => {
|
||||||
|
return await this.client.execute(
|
||||||
|
this.sender,
|
||||||
|
this.contractAddress,
|
||||||
|
{
|
||||||
|
set_price_source: {
|
||||||
|
denom,
|
||||||
|
price_source: priceSource,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fee,
|
||||||
|
memo,
|
||||||
|
_funds,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
removePriceSource = async (
|
||||||
|
{
|
||||||
|
denom,
|
||||||
|
}: {
|
||||||
|
denom: string
|
||||||
|
},
|
||||||
|
fee: number | StdFee | 'auto' = 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
): Promise<ExecuteResult> => {
|
||||||
|
return await this.client.execute(
|
||||||
|
this.sender,
|
||||||
|
this.contractAddress,
|
||||||
|
{
|
||||||
|
remove_price_source: {
|
||||||
|
denom,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fee,
|
||||||
|
memo,
|
||||||
|
_funds,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
updateOwner = async (
|
||||||
|
ownerUpdate: OwnerUpdate,
|
||||||
|
fee: number | StdFee | 'auto' = 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
): Promise<ExecuteResult> => {
|
||||||
|
return await this.client.execute(
|
||||||
|
this.sender,
|
||||||
|
this.contractAddress,
|
||||||
|
{
|
||||||
|
update_owner: ownerUpdate,
|
||||||
|
},
|
||||||
|
fee,
|
||||||
|
memo,
|
||||||
|
_funds,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
updateConfig = async (
|
||||||
|
{
|
||||||
|
baseDenom,
|
||||||
|
}: {
|
||||||
|
baseDenom?: string
|
||||||
|
},
|
||||||
|
fee: number | StdFee | 'auto' = 'auto',
|
||||||
|
memo?: string,
|
||||||
|
_funds?: Coin[],
|
||||||
|
): Promise<ExecuteResult> => {
|
||||||
|
return await this.client.execute(
|
||||||
|
this.sender,
|
||||||
|
this.contractAddress,
|
||||||
|
{
|
||||||
|
update_config: {
|
||||||
|
base_denom: baseDenom,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fee,
|
||||||
|
memo,
|
||||||
|
_funds,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,259 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
/**
|
||||||
|
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.0.
|
||||||
|
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||||
|
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { UseQueryOptions, useQuery, useMutation, UseMutationOptions } from '@tanstack/react-query'
|
||||||
|
import { ExecuteResult } from '@cosmjs/cosmwasm-stargate'
|
||||||
|
import { StdFee, Coin } from '@cosmjs/amino'
|
||||||
|
import {
|
||||||
|
InstantiateMsg,
|
||||||
|
ExecuteMsg,
|
||||||
|
OsmosisPriceSourceForString,
|
||||||
|
Decimal,
|
||||||
|
Downtime,
|
||||||
|
Identifier,
|
||||||
|
OwnerUpdate,
|
||||||
|
DowntimeDetector,
|
||||||
|
GeometricTwap,
|
||||||
|
RedemptionRateForString,
|
||||||
|
QueryMsg,
|
||||||
|
ConfigResponse,
|
||||||
|
PriceResponse,
|
||||||
|
PriceSourceResponseForString,
|
||||||
|
ArrayOfPriceSourceResponseForString,
|
||||||
|
ArrayOfPriceResponse,
|
||||||
|
} from './MarsOracleOsmosis.types'
|
||||||
|
import { MarsOracleOsmosisQueryClient, MarsOracleOsmosisClient } from './MarsOracleOsmosis.client'
|
||||||
|
export const marsOracleOsmosisQueryKeys = {
|
||||||
|
contract: [
|
||||||
|
{
|
||||||
|
contract: 'marsOracleOsmosis',
|
||||||
|
},
|
||||||
|
] as const,
|
||||||
|
address: (contractAddress: string | undefined) =>
|
||||||
|
[{ ...marsOracleOsmosisQueryKeys.contract[0], address: contractAddress }] as const,
|
||||||
|
config: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
||||||
|
[
|
||||||
|
{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'config', args },
|
||||||
|
] as const,
|
||||||
|
priceSource: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
||||||
|
[
|
||||||
|
{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price_source', args },
|
||||||
|
] as const,
|
||||||
|
priceSources: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
||||||
|
[
|
||||||
|
{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price_sources', args },
|
||||||
|
] as const,
|
||||||
|
price: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
||||||
|
[{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price', args }] as const,
|
||||||
|
prices: (contractAddress: string | undefined, args?: Record<string, unknown>) =>
|
||||||
|
[
|
||||||
|
{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'prices', args },
|
||||||
|
] as const,
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisReactQuery<TResponse, TData = TResponse> {
|
||||||
|
client: MarsOracleOsmosisQueryClient | undefined
|
||||||
|
options?: Omit<
|
||||||
|
UseQueryOptions<TResponse, Error, TData>,
|
||||||
|
"'queryKey' | 'queryFn' | 'initialData'"
|
||||||
|
> & {
|
||||||
|
initialData?: undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisPricesQuery<TData>
|
||||||
|
extends MarsOracleOsmosisReactQuery<ArrayOfPriceResponse, TData> {
|
||||||
|
args: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisPricesQuery<TData = ArrayOfPriceResponse>({
|
||||||
|
client,
|
||||||
|
args,
|
||||||
|
options,
|
||||||
|
}: MarsOracleOsmosisPricesQuery<TData>) {
|
||||||
|
return useQuery<ArrayOfPriceResponse, Error, TData>(
|
||||||
|
marsOracleOsmosisQueryKeys.prices(client?.contractAddress, args),
|
||||||
|
() =>
|
||||||
|
client
|
||||||
|
? client.prices({
|
||||||
|
limit: args.limit,
|
||||||
|
startAfter: args.startAfter,
|
||||||
|
})
|
||||||
|
: Promise.reject(new Error('Invalid client')),
|
||||||
|
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisPriceQuery<TData>
|
||||||
|
extends MarsOracleOsmosisReactQuery<PriceResponse, TData> {
|
||||||
|
args: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisPriceQuery<TData = PriceResponse>({
|
||||||
|
client,
|
||||||
|
args,
|
||||||
|
options,
|
||||||
|
}: MarsOracleOsmosisPriceQuery<TData>) {
|
||||||
|
return useQuery<PriceResponse, Error, TData>(
|
||||||
|
marsOracleOsmosisQueryKeys.price(client?.contractAddress, args),
|
||||||
|
() =>
|
||||||
|
client
|
||||||
|
? client.price({
|
||||||
|
denom: args.denom,
|
||||||
|
})
|
||||||
|
: Promise.reject(new Error('Invalid client')),
|
||||||
|
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisPriceSourcesQuery<TData>
|
||||||
|
extends MarsOracleOsmosisReactQuery<ArrayOfPriceSourceResponseForString, TData> {
|
||||||
|
args: {
|
||||||
|
limit?: number
|
||||||
|
startAfter?: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisPriceSourcesQuery<TData = ArrayOfPriceSourceResponseForString>({
|
||||||
|
client,
|
||||||
|
args,
|
||||||
|
options,
|
||||||
|
}: MarsOracleOsmosisPriceSourcesQuery<TData>) {
|
||||||
|
return useQuery<ArrayOfPriceSourceResponseForString, Error, TData>(
|
||||||
|
marsOracleOsmosisQueryKeys.priceSources(client?.contractAddress, args),
|
||||||
|
() =>
|
||||||
|
client
|
||||||
|
? client.priceSources({
|
||||||
|
limit: args.limit,
|
||||||
|
startAfter: args.startAfter,
|
||||||
|
})
|
||||||
|
: Promise.reject(new Error('Invalid client')),
|
||||||
|
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisPriceSourceQuery<TData>
|
||||||
|
extends MarsOracleOsmosisReactQuery<PriceSourceResponseForString, TData> {
|
||||||
|
args: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisPriceSourceQuery<TData = PriceSourceResponseForString>({
|
||||||
|
client,
|
||||||
|
args,
|
||||||
|
options,
|
||||||
|
}: MarsOracleOsmosisPriceSourceQuery<TData>) {
|
||||||
|
return useQuery<PriceSourceResponseForString, Error, TData>(
|
||||||
|
marsOracleOsmosisQueryKeys.priceSource(client?.contractAddress, args),
|
||||||
|
() =>
|
||||||
|
client
|
||||||
|
? client.priceSource({
|
||||||
|
denom: args.denom,
|
||||||
|
})
|
||||||
|
: Promise.reject(new Error('Invalid client')),
|
||||||
|
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisConfigQuery<TData>
|
||||||
|
extends MarsOracleOsmosisReactQuery<ConfigResponse, TData> {}
|
||||||
|
export function useMarsOracleOsmosisConfigQuery<TData = ConfigResponse>({
|
||||||
|
client,
|
||||||
|
options,
|
||||||
|
}: MarsOracleOsmosisConfigQuery<TData>) {
|
||||||
|
return useQuery<ConfigResponse, Error, TData>(
|
||||||
|
marsOracleOsmosisQueryKeys.config(client?.contractAddress),
|
||||||
|
() => (client ? client.config() : Promise.reject(new Error('Invalid client'))),
|
||||||
|
{ ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisUpdateConfigMutation {
|
||||||
|
client: MarsOracleOsmosisClient
|
||||||
|
msg: {
|
||||||
|
baseDenom?: string
|
||||||
|
}
|
||||||
|
args?: {
|
||||||
|
fee?: number | StdFee | 'auto'
|
||||||
|
memo?: string
|
||||||
|
funds?: Coin[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisUpdateConfigMutation(
|
||||||
|
options?: Omit<
|
||||||
|
UseMutationOptions<ExecuteResult, Error, MarsOracleOsmosisUpdateConfigMutation>,
|
||||||
|
'mutationFn'
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
return useMutation<ExecuteResult, Error, MarsOracleOsmosisUpdateConfigMutation>(
|
||||||
|
({ client, msg, args: { fee, memo, funds } = {} }) =>
|
||||||
|
client.updateConfig(msg, fee, memo, funds),
|
||||||
|
options,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisUpdateOwnerMutation {
|
||||||
|
client: MarsOracleOsmosisClient
|
||||||
|
msg: OwnerUpdate
|
||||||
|
args?: {
|
||||||
|
fee?: number | StdFee | 'auto'
|
||||||
|
memo?: string
|
||||||
|
funds?: Coin[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisUpdateOwnerMutation(
|
||||||
|
options?: Omit<
|
||||||
|
UseMutationOptions<ExecuteResult, Error, MarsOracleOsmosisUpdateOwnerMutation>,
|
||||||
|
'mutationFn'
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
return useMutation<ExecuteResult, Error, MarsOracleOsmosisUpdateOwnerMutation>(
|
||||||
|
({ client, msg, args: { fee, memo, funds } = {} }) => client.updateOwner(msg, fee, memo, funds),
|
||||||
|
options,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisRemovePriceSourceMutation {
|
||||||
|
client: MarsOracleOsmosisClient
|
||||||
|
msg: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
args?: {
|
||||||
|
fee?: number | StdFee | 'auto'
|
||||||
|
memo?: string
|
||||||
|
funds?: Coin[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisRemovePriceSourceMutation(
|
||||||
|
options?: Omit<
|
||||||
|
UseMutationOptions<ExecuteResult, Error, MarsOracleOsmosisRemovePriceSourceMutation>,
|
||||||
|
'mutationFn'
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
return useMutation<ExecuteResult, Error, MarsOracleOsmosisRemovePriceSourceMutation>(
|
||||||
|
({ client, msg, args: { fee, memo, funds } = {} }) =>
|
||||||
|
client.removePriceSource(msg, fee, memo, funds),
|
||||||
|
options,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export interface MarsOracleOsmosisSetPriceSourceMutation {
|
||||||
|
client: MarsOracleOsmosisClient
|
||||||
|
msg: {
|
||||||
|
denom: string
|
||||||
|
priceSource: OsmosisPriceSourceForString
|
||||||
|
}
|
||||||
|
args?: {
|
||||||
|
fee?: number | StdFee | 'auto'
|
||||||
|
memo?: string
|
||||||
|
funds?: Coin[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function useMarsOracleOsmosisSetPriceSourceMutation(
|
||||||
|
options?: Omit<
|
||||||
|
UseMutationOptions<ExecuteResult, Error, MarsOracleOsmosisSetPriceSourceMutation>,
|
||||||
|
'mutationFn'
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
return useMutation<ExecuteResult, Error, MarsOracleOsmosisSetPriceSourceMutation>(
|
||||||
|
({ client, msg, args: { fee, memo, funds } = {} }) =>
|
||||||
|
client.setPriceSource(msg, fee, memo, funds),
|
||||||
|
options,
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,192 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
/**
|
||||||
|
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.0.
|
||||||
|
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||||
|
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface InstantiateMsg {
|
||||||
|
base_denom: string
|
||||||
|
owner: string
|
||||||
|
}
|
||||||
|
export type ExecuteMsg =
|
||||||
|
| {
|
||||||
|
set_price_source: {
|
||||||
|
denom: string
|
||||||
|
price_source: OsmosisPriceSourceForString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
remove_price_source: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
update_owner: OwnerUpdate
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
update_config: {
|
||||||
|
base_denom?: string | null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export type OsmosisPriceSourceForString =
|
||||||
|
| {
|
||||||
|
fixed: {
|
||||||
|
price: Decimal
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
spot: {
|
||||||
|
pool_id: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
arithmetic_twap: {
|
||||||
|
downtime_detector?: DowntimeDetector | null
|
||||||
|
pool_id: number
|
||||||
|
window_size: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
geometric_twap: {
|
||||||
|
downtime_detector?: DowntimeDetector | null
|
||||||
|
pool_id: number
|
||||||
|
window_size: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
xyk_liquidity_token: {
|
||||||
|
pool_id: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
staked_geometric_twap: {
|
||||||
|
downtime_detector?: DowntimeDetector | null
|
||||||
|
pool_id: number
|
||||||
|
transitive_denom: string
|
||||||
|
window_size: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
pyth: {
|
||||||
|
contract_addr: string
|
||||||
|
denom_decimals: number
|
||||||
|
max_staleness: number
|
||||||
|
price_feed_id: Identifier
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
lsd: {
|
||||||
|
geometric_twap: GeometricTwap
|
||||||
|
redemption_rate: RedemptionRateForString
|
||||||
|
transitive_denom: string
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export type Decimal = string
|
||||||
|
export type Downtime =
|
||||||
|
| 'duration30s'
|
||||||
|
| 'duration1m'
|
||||||
|
| 'duration2m'
|
||||||
|
| 'duration3m'
|
||||||
|
| 'duration4m'
|
||||||
|
| 'duration5m'
|
||||||
|
| 'duration10m'
|
||||||
|
| 'duration20m'
|
||||||
|
| 'duration30m'
|
||||||
|
| 'duration40m'
|
||||||
|
| 'duration50m'
|
||||||
|
| 'duration1h'
|
||||||
|
| 'duration15h'
|
||||||
|
| 'duration2h'
|
||||||
|
| 'duration25h'
|
||||||
|
| 'duration3h'
|
||||||
|
| 'duration4h'
|
||||||
|
| 'duration5h'
|
||||||
|
| 'duration6h'
|
||||||
|
| 'duration9h'
|
||||||
|
| 'duration12h'
|
||||||
|
| 'duration18h'
|
||||||
|
| 'duration24h'
|
||||||
|
| 'duration36h'
|
||||||
|
| 'duration48h'
|
||||||
|
export type Identifier = string
|
||||||
|
export type OwnerUpdate =
|
||||||
|
| {
|
||||||
|
propose_new_owner: {
|
||||||
|
proposed: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| 'clear_proposed'
|
||||||
|
| 'accept_proposed'
|
||||||
|
| 'abolish_owner_role'
|
||||||
|
| {
|
||||||
|
set_emergency_owner: {
|
||||||
|
emergency_owner: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| 'clear_emergency_owner'
|
||||||
|
export interface DowntimeDetector {
|
||||||
|
downtime: Downtime
|
||||||
|
recovery: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
export interface GeometricTwap {
|
||||||
|
downtime_detector?: DowntimeDetector | null
|
||||||
|
pool_id: number
|
||||||
|
window_size: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
export interface RedemptionRateForString {
|
||||||
|
contract_addr: string
|
||||||
|
max_staleness: number
|
||||||
|
[k: string]: unknown
|
||||||
|
}
|
||||||
|
export type QueryMsg =
|
||||||
|
| {
|
||||||
|
config: {}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
price_source: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
price_sources: {
|
||||||
|
limit?: number | null
|
||||||
|
start_after?: string | null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
price: {
|
||||||
|
denom: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
prices: {
|
||||||
|
limit?: number | null
|
||||||
|
start_after?: string | null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export interface ConfigResponse {
|
||||||
|
base_denom: string
|
||||||
|
owner?: string | null
|
||||||
|
proposed_new_owner?: string | null
|
||||||
|
}
|
||||||
|
export interface PriceResponse {
|
||||||
|
denom: string
|
||||||
|
price: Decimal
|
||||||
|
}
|
||||||
|
export interface PriceSourceResponseForString {
|
||||||
|
denom: string
|
||||||
|
price_source: string
|
||||||
|
}
|
||||||
|
export type ArrayOfPriceSourceResponseForString = PriceSourceResponseForString[]
|
||||||
|
export type ArrayOfPriceResponse = PriceResponse[]
|
13
src/types/generated/mars-oracle-osmosis/bundle.ts
Normal file
13
src/types/generated/mars-oracle-osmosis/bundle.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
/**
|
||||||
|
* This file was automatically generated by @cosmwasm/ts-codegen@0.30.0.
|
||||||
|
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||||
|
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as _6 from './MarsOracleOsmosis.types'
|
||||||
|
import * as _7 from './MarsOracleOsmosis.client'
|
||||||
|
import * as _8 from './MarsOracleOsmosis.react-query'
|
||||||
|
export namespace contracts {
|
||||||
|
export const MarsOracleOsmosis = { ..._6, ..._7, ..._8 }
|
||||||
|
}
|
36
src/utils/iterateContractQuery.ts
Normal file
36
src/utils/iterateContractQuery.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { ITEM_LIMIT_PER_QUERY } from 'constants/query'
|
||||||
|
|
||||||
|
interface KeyProperties {
|
||||||
|
denom?: string
|
||||||
|
addr?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Query<T> = ({
|
||||||
|
limit,
|
||||||
|
startAfter,
|
||||||
|
}: {
|
||||||
|
limit?: number | undefined
|
||||||
|
startAfter?: string | undefined
|
||||||
|
}) => Promise<T[]>
|
||||||
|
|
||||||
|
export default async function iterateContractQuery<T extends KeyProperties>(
|
||||||
|
query: Query<T>,
|
||||||
|
keyProperty: keyof KeyProperties = 'denom',
|
||||||
|
previousResults?: T[],
|
||||||
|
): Promise<T[]> {
|
||||||
|
const lastItem = previousResults && previousResults.at(-1)
|
||||||
|
const lastItemKey = lastItem && lastItem[keyProperty]
|
||||||
|
const params = {
|
||||||
|
limit: ITEM_LIMIT_PER_QUERY,
|
||||||
|
startAfter: lastItemKey,
|
||||||
|
}
|
||||||
|
|
||||||
|
const results = await query(params)
|
||||||
|
const accumulated = (previousResults ?? []).concat(results)
|
||||||
|
|
||||||
|
if (results.length < ITEM_LIMIT_PER_QUERY) {
|
||||||
|
return accumulated
|
||||||
|
}
|
||||||
|
|
||||||
|
return await iterateContractQuery(query, keyProperty, accumulated)
|
||||||
|
}
|
@ -33,8 +33,29 @@ if (!process.env.NEXT_PUBLIC_REST) {
|
|||||||
if (!process.env.NEXT_PUBLIC_APOLLO_APR) {
|
if (!process.env.NEXT_PUBLIC_APOLLO_APR) {
|
||||||
throw 'NEXT_PUBLIC_APOLLO_APR is not defined'
|
throw 'NEXT_PUBLIC_APOLLO_APR is not defined'
|
||||||
}
|
}
|
||||||
|
if (!process.env.NEXT_PUBLIC_PARAMS) {
|
||||||
|
throw 'NEXT_PUBLIC_PARAMS is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.NEXT_PUBLIC_CANDLES_ENDPOINT) {
|
||||||
|
throw 'NEXT_PUBLIC_CANDLES_ENDPOINT is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.CHARTING_LIBRARY_USERNAME) {
|
||||||
|
throw 'CHARTING_LIBRARY_USERNAME is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.CHARTING_LIBRARY_ACCESS_TOKEN) {
|
||||||
|
throw 'CHARTING_LIBRARY_ACCESS_TOKEN is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.CHARTING_LIBRARY_REPOSITORY) {
|
||||||
|
throw 'CHARTING_LIBRARY_REPOSITORY is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.NEXT_PUBLIC_PYTH_ENDPOINT) {
|
||||||
|
throw 'NEXT_PUBLIC_PYTH_ENDPOINT is not defined'
|
||||||
|
}
|
||||||
|
if (!process.env.NEXT_PUBLIC_MAINNET_REST) {
|
||||||
|
throw 'NEXT_PUBLIC_MAINNET_REST is not defined'
|
||||||
|
}
|
||||||
if (!process.env.NEXT_PUBLIC_RPC) {
|
if (!process.env.NEXT_PUBLIC_RPC) {
|
||||||
throw 'NEXT_PUBLIC_RPC is not defined'
|
throw 'NEXT_PUBLIC_RPC is not defined'
|
||||||
} else {
|
|
||||||
console.log('✅ Required env variables set')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('✅ Required env variables set')
|
||||||
|
Loading…
Reference in New Issue
Block a user