Skip to content

Commit

Permalink
EVM permit and nonce rework
Browse files Browse the repository at this point in the history
  • Loading branch information
jvonasek committed Oct 3, 2024
1 parent 1fdc604 commit 666667a
Show file tree
Hide file tree
Showing 6 changed files with 184 additions and 149 deletions.
87 changes: 1 addition & 86 deletions src/api/transaction.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
import { SubmittableExtrinsic } from "@polkadot/api/promise/types"
import {
useAccount,
useEvmAccount,
useWallet,
} from "sections/web3-connect/Web3Connect.utils"
import { useAccount } from "sections/web3-connect/Web3Connect.utils"
import { AccountId32 } from "@polkadot/types/interfaces"
import { useMutation, useQueries, useQuery } from "@tanstack/react-query"
import { QUERY_KEYS } from "utils/queryKeys"
import { Maybe, undefinedNoop } from "utils/helpers"
import { ApiPromise } from "@polkadot/api"
import { useRpcProvider } from "providers/rpcProvider"
import { BN_0, BN_1 } from "utils/constants"
import {
EthereumSigner,
PermitResult,
} from "sections/web3-connect/signer/EthereumSigner"
import { create } from "zustand"
import BigNumber from "bignumber.js"
import { useSpotPrice } from "api/spotPrice"
import { useAccountCurrency } from "api/payments"
Expand Down Expand Up @@ -57,51 +48,6 @@ export function useMultiplePaymentInfo(
return useQueries({ queries })
}

export function useNextEvmPermitNonce() {
const { account } = useEvmAccount()
const address = account?.address ?? ""
const { wallet } = useWallet()
const {
permitNonce,
pendingPermit,
setPermitNonce,
incrementPermitNonce,
revertPermitNonce,
setPendingPermit,
} = useEvmPermitStore()

const isEvmSigner = wallet?.signer instanceof EthereumSigner
const currentPermitNonce = permitNonce[address]

useQuery(
QUERY_KEYS.nextEvmPermitNonce(address),
async () => {
if (!address) throw new Error("Missing address")
if (!wallet?.signer) throw new Error("Missing wallet signer")
if (!isEvmSigner) throw new Error("Invalid signer")
return await wallet.signer.getPermitNonce()
},
{
enabled: !!address && isEvmSigner && !currentPermitNonce,
cacheTime: 1000 * 60 * 60 * 24,
keepPreviousData: true,
onSuccess: (nonce) => {
if (address && nonce) {
setPermitNonce(address, nonce)
}
},
},
)

return {
permitNonce: currentPermitNonce ?? BN_0,
pendingPermit,
incrementPermitNonce,
revertPermitNonce,
setPendingPermit,
}
}

export function useNextNonce(account: Maybe<AccountId32 | string>) {
const { api } = useRpcProvider()

Expand Down Expand Up @@ -154,37 +100,6 @@ export async function getTransactionLinkFromHash(
}
}

export const useEvmPermitStore = create<{
pendingPermit: PermitResult | null
permitNonce: { [address: string]: BigNumber }
setPermitNonce: (address: string, nonce: BigNumber) => void
setPendingPermit: (permit: PermitResult | null) => void
revertPermitNonce: (address: string) => void
incrementPermitNonce: (address: string) => void
}>((set) => ({
pendingPermit: null,
permitNonce: {},
setPermitNonce: (address, nonce) =>
set(({ permitNonce }) => ({
permitNonce: { ...permitNonce, [address]: nonce },
})),
setPendingPermit: (permit) => set({ pendingPermit: permit }),
revertPermitNonce: (address) =>
set(({ permitNonce }) => ({
permitNonce: {
...permitNonce,
[address]: (permitNonce[address] ?? BN_0).minus(1),
},
})),
incrementPermitNonce: (address) =>
set(({ permitNonce }) => ({
permitNonce: {
...permitNonce,
[address]: (permitNonce[address] ?? BN_0).plus(1),
},
})),
}))

export const useEstimatedFees = (txs: SubmittableExtrinsic[]) => {
const { getAsset, native } = useAssets()
const { account } = useAccount()
Expand Down
Loading

0 comments on commit 666667a

Please sign in to comment.