import { BigNumberish, constants, Signature, Wallet } from 'ethers' import { splitSignature } from 'ethers/lib/utils' import { TestERC20, TestERC20PermitAllowed } from '../../typechain' export async function getPermitSignature( wallet: Wallet, token: TestERC20 | TestERC20PermitAllowed, spender: string, value: BigNumberish = constants.MaxUint256, deadline = constants.MaxUint256, permitConfig?: { nonce?: BigNumberish; name?: string; chainId?: number; version?: string } ): Promise { const [nonce, name, version, chainId] = await Promise.all([ permitConfig?.nonce ?? token.nonces(wallet.address), permitConfig?.name ?? token.name(), permitConfig?.version ?? '1', permitConfig?.chainId ?? wallet.getChainId(), ]) return splitSignature( await wallet._signTypedData( { name, version, chainId, verifyingContract: token.address, }, { Permit: [ { name: 'owner', type: 'address', }, { name: 'spender', type: 'address', }, { name: 'value', type: 'uint256', }, { name: 'nonce', type: 'uint256', }, { name: 'deadline', type: 'uint256', }, ], }, { owner: wallet.address, spender, value, nonce, deadline, } ) ) }