mirror of
https://github.com/cerc-io/mars-interface.git
synced 2025-09-15 22:24:06 +00:00
64 lines
1.8 KiB
TypeScript
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),
|
|
},
|
|
)
|
|
}
|