diff --git a/packages/app/src/config.ts b/packages/app/src/config.ts index a6c7cc20..c2437064 100644 --- a/packages/app/src/config.ts +++ b/packages/app/src/config.ts @@ -18,7 +18,7 @@ export const SLIPPAGE_TOLERANCE = 0.005; /** Small network fee */ export const NETWORK_FEE = 1; /** Default deadline */ -export const DEADLINE = 99999999999; +export const DEADLINE = 1000; /** Max presentation units to avoid show 9 decimals on screen */ export const FIXED_UNITS = 3; /** Min gas price required from the fuel-core */ diff --git a/packages/app/src/systems/Core/hooks/useTransactionCost.ts b/packages/app/src/systems/Core/hooks/useTransactionCost.ts index dc17d182..81bc27e4 100644 --- a/packages/app/src/systems/Core/hooks/useTransactionCost.ts +++ b/packages/app/src/systems/Core/hooks/useTransactionCost.ts @@ -7,9 +7,12 @@ import { emptyTransactionCost, getTransactionCost } from '../utils/gas'; import { useEthBalance } from './useEthBalance'; +type ContractCallFuncPromise = () => Promise; +type ContractCallFunc = () => ContractCall; + export function useTransactionCost( queryKey: unknown[], - request: () => ContractCall, + request: ContractCallFunc | ContractCallFuncPromise, options?: Omit, 'queryKey' | 'queryFn'> ) { const ethBalance = useEthBalance(); @@ -20,7 +23,7 @@ export function useTransactionCost( const { data } = useQuery( queryKey, - async () => getTransactionCost(request()), + async () => getTransactionCost(await request()), options ); diff --git a/packages/app/src/systems/Core/utils/chain.ts b/packages/app/src/systems/Core/utils/chain.ts new file mode 100644 index 00000000..ea915c95 --- /dev/null +++ b/packages/app/src/systems/Core/utils/chain.ts @@ -0,0 +1,11 @@ +import type { Contract } from 'fuels'; + +import { toBigInt } from './math'; + +import { DEADLINE } from '~/config'; + +export async function getDeadline(contract: Contract, deadline?: bigint) { + const blockHeight = await contract.wallet!.provider.getBlockNumber(); + const nexDeadline = blockHeight + (deadline || toBigInt(DEADLINE)); + return nexDeadline; +} diff --git a/packages/app/src/systems/Core/utils/index.ts b/packages/app/src/systems/Core/utils/index.ts index 2ae95f41..bfcc29cb 100644 --- a/packages/app/src/systems/Core/utils/index.ts +++ b/packages/app/src/systems/Core/utils/index.ts @@ -4,3 +4,4 @@ export * from './constants'; export * from './math'; export * from './queryClient'; export * from './helpers'; +export * from './chain'; diff --git a/packages/app/src/systems/Pool/hooks/useAddLiquidity.ts b/packages/app/src/systems/Pool/hooks/useAddLiquidity.ts index d0a83d79..e2c70ef5 100644 --- a/packages/app/src/systems/Pool/hooks/useAddLiquidity.ts +++ b/packages/app/src/systems/Pool/hooks/useAddLiquidity.ts @@ -5,9 +5,8 @@ import { useNavigate } from 'react-router-dom'; import { useUserPositions } from './useUserPositions'; -import { DEADLINE } from '~/config'; import type { UseCoinInput } from '~/systems/Core'; -import { useContract, toBigInt } from '~/systems/Core'; +import { getDeadline, useContract, toBigInt } from '~/systems/Core'; import { getOverrides } from '~/systems/Core/utils/gas'; import type { Coin } from '~/types'; @@ -74,9 +73,10 @@ export function useAddLiquidity({ ); setStage(2); // Create liquidity pool + const deadline = await getDeadline(contract); const liquidityTokens = await contract.submit.add_liquidity( 1, - DEADLINE, + deadline, getOverrides({ variableOutputs: 2, gasLimit: toBigInt(1500000), diff --git a/packages/app/src/systems/Pool/utils/queries.ts b/packages/app/src/systems/Pool/utils/queries.ts index 3f25a03a..ecb9450f 100644 --- a/packages/app/src/systems/Pool/utils/queries.ts +++ b/packages/app/src/systems/Pool/utils/queries.ts @@ -1,6 +1,7 @@ import type { Contract } from 'fuels'; -import { CONTRACT_ID, DEADLINE } from '~/config'; +import { CONTRACT_ID } from '~/config'; +import { getDeadline } from '~/systems/Core'; import type { TransactionCost } from '~/systems/Core/utils/gas'; import { getOverrides } from '~/systems/Core/utils/gas'; @@ -8,8 +9,9 @@ export enum PoolQueries { RemoveLiquidityNetworkFee = 'RemoveLiquidity-networkFee', } -export function prepareRemoveLiquidity(contract: Contract) { - return contract.prepareCall.remove_liquidity(1, 1, DEADLINE, { +export async function prepareRemoveLiquidity(contract: Contract) { + const deadline = await getDeadline(contract); + return contract.prepareCall.remove_liquidity(1, 1, deadline, { forward: [1, CONTRACT_ID], variableOutputs: 2, gasLimit: 100_000_000, @@ -21,10 +23,11 @@ export async function submitRemoveLiquidity( amount: bigint, txCost: TransactionCost ) { + const deadline = await getDeadline(contract); return contract.submit.remove_liquidity( 1, 1, - DEADLINE, + deadline, getOverrides({ forward: [amount, CONTRACT_ID], variableOutputs: 2, diff --git a/packages/app/src/systems/Swap/utils/queries.ts b/packages/app/src/systems/Swap/utils/queries.ts index b4488993..725864c7 100644 --- a/packages/app/src/systems/Swap/utils/queries.ts +++ b/packages/app/src/systems/Swap/utils/queries.ts @@ -1,8 +1,7 @@ import type { SwapState } from '../types'; import { ActiveInput } from '../types'; -import { DEADLINE } from '~/config'; -import { COIN_ETH } from '~/systems/Core'; +import { COIN_ETH, getDeadline } from '~/systems/Core'; import type { TransactionCost } from '~/systems/Core/utils/gas'; import { getOverrides } from '~/systems/Core/utils/gas'; import type { ExchangeContractAbi } from '~/types/contracts'; @@ -58,6 +57,8 @@ export const swapTokens = async ( { coinFrom, direction, amount }: SwapState, txCost: TransactionCost ) => { + const deadline = await getDeadline(contract); + if (direction === ActiveInput.to && amount) { const forwardAmount = await getSwapWithMaximumRequiredAmount( contract, @@ -69,7 +70,7 @@ export const swapTokens = async ( } return contract.submitResult.swap_with_maximum( amount, - DEADLINE, + deadline, getOverrides({ forward: [forwardAmount.amount, coinFrom.assetId], gasLimit: txCost.total, @@ -85,7 +86,7 @@ export const swapTokens = async ( return contract.submitResult.swap_with_minimum( minValue.amount, - DEADLINE, + deadline, getOverrides({ forward: [amount, coinFrom.assetId], gasLimit: txCost.total, @@ -95,16 +96,18 @@ export const swapTokens = async ( } }; -export const queryNetworkFee = (contract: ExchangeContractAbi, direction?: ActiveInput) => { +export const queryNetworkFee = async (contract: ExchangeContractAbi, direction?: ActiveInput) => { const directionValue = direction || ActiveInput.from; + const deadline = await getDeadline(contract); + if (directionValue === ActiveInput.to) { - return contract.prepareCall.swap_with_maximum(1, DEADLINE, { + return contract.prepareCall.swap_with_maximum(1, deadline, { forward: [1, COIN_ETH], variableOutputs: 2, gasLimit: 1000000, }); } - return contract.prepareCall.swap_with_minimum(1, DEADLINE, { + return contract.prepareCall.swap_with_minimum(1, deadline, { forward: [1, COIN_ETH], variableOutputs: 1, gasLimit: 1000000,