UNPKG

@0xpolygonid/js-sdk

Version:
52 lines (51 loc) 1.95 kB
import { Contract } from 'ethers'; import permitAbi from './abi/ERC20Permit.json'; import erc20Abi from './abi/ERC20.json'; /** * @beta * getPermitSignature is a function to create EIP712 Permit signature * @param {Signer} signer - User who owns the tokens * @param {string} tokenAddress - EIP-2612 contract address * @param {string} spender - The contract address that will spend tokens * @param {bigint} value - Amount of tokens to approve * @param {number} deadline - Timestamp when the permit expires * @returns {Promise<PaymentRequestMessage>} */ export async function getPermitSignature(signer, tokenAddress, spender, value, deadline) { const erc20PermitContract = new Contract(tokenAddress, permitAbi, signer); const nonce = await erc20PermitContract.nonces(await signer.getAddress()); const domainData = await erc20PermitContract.eip712Domain(); const domain = { name: domainData[1], version: domainData[2], chainId: domainData[3], verifyingContract: tokenAddress }; const types = { Permit: [ { name: 'owner', type: 'address' }, { name: 'spender', type: 'address' }, { name: 'value', type: 'uint256' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' } ] }; const message = { owner: await signer.getAddress(), spender: spender, value: value, nonce: nonce, deadline: deadline }; return signer.signTypedData(domain, types, message); } /** * @beta * getERC20Decimals is a function to retrieve the number of decimals of an ERC20 token * @param {string} tokenAddress - Token address * @param {ethers.ContractRunner} runner - Contract runner */ export async function getERC20Decimals(tokenAddress, runner) { const erc20Contract = new Contract(tokenAddress, erc20Abi, runner); return erc20Contract.decimals(); }