mars-interface/src/hooks/queries/useEstimateFee.tsx
2023-02-10 18:27:20 +01:00

64 lines
1.8 KiB
TypeScript

import { MsgExecuteContractEncodeObject } from '@cosmjs/cosmwasm-stargate'
import { Coin } from '@cosmjs/proto-signing'
import { MsgExecuteContract } from '@marsprotocol/wallet-connector'
import { useQuery } from '@tanstack/react-query'
import BigNumber from 'bignumber.js'
import { GAS_ADJUSTMENT } from 'constants/appConstants'
import useStore from 'store'
import { QUERY_KEYS } from 'types/enums/queryKeys'
import { ContractMsg } from 'types/types'
interface Props {
msg?: ContractMsg
funds?: Coin[]
contract?: string
sender?: string
executeMsg?: MsgExecuteContractEncodeObject
}
export const useEstimateFee = (props: Props) => {
const userWalletAddress = useStore((s) => s.userWalletAddress)
const client = useStore((s) => s.client)
return useQuery(
[QUERY_KEYS.ESTIMATE_FEE, props.msg],
async () => {
const sender = props.sender ? props.sender : userWalletAddress
const gasAdjustment = GAS_ADJUSTMENT
if (!client || !props.contract || !props.msg) return
try {
const simulateOptions = {
messages: [
new MsgExecuteContract({
sender: sender,
contract: props.contract,
msg: props.msg,
funds: props.funds,
}),
],
wallet: client.recentWallet,
}
const result = await client.simulate(simulateOptions)
if (result.success) {
return {
amount: result.fee ? result.fee.amount : [],
gas: new BigNumber(result.fee ? result.fee.gas : 0)
.multipliedBy(gasAdjustment)
.toFixed(0),
}
}
throw result.error
} catch (e) {
throw e
}
},
{
enabled: !!client && ((!!props.msg && !!props.contract) || !!props.executeMsg),
},
)
}