UNPKG

butterjs-sdk

Version:
74 lines (73 loc) 2.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.revokeTokenApproval = exports.approveToken = exports.getApprovedAmount = exports.readAllowance = void 0; const ethers_1 = require("ethers"); const bignumber_1 = require("@ethersproject/bignumber"); const ERC20ABI_1 = require("../abis/ERC20ABI"); /** * get contract allowance for token * @param signer ethers.js signer * @param tokenAddress the address of token to be approved * @param contractAddress spender address */ async function readAllowance(signer, tokenAddress, contractAddress) { const signerAddress = await signer.getAddress(); const erc20 = new ethers_1.Contract(tokenAddress, ERC20ABI_1.ERC20_ABI, signer); try { const approvedAmount = await erc20.allowance(signerAddress, contractAddress); return bignumber_1.BigNumber.from(approvedAmount.toString()); } catch (e) { return bignumber_1.BigNumber.from(0); } } exports.readAllowance = readAllowance; /** * approve token spend * @param signer ethers.js signer * @param tokenAddress the address of token to be approved * @param contractAddress spender address * @param amount amount to approved in minimal unit */ function doApprove(signer, tokenAddress, contractAddress, amount) { const erc20 = new ethers_1.Contract(tokenAddress, ERC20ABI_1.ERC20_ABI, signer); return erc20.approve(contractAddress, amount, { gasLimit: 3000000 }); } async function getApprovedAmount(signer, token, approvalAddress) { if (token.isNative) { return; } const approvedAmount = await readAllowance(signer, token.address, approvalAddress); return approvedAmount.toString(); } exports.getApprovedAmount = getApprovedAmount; async function approveToken(signer, token, amount, approvalAddress, unlimitedAmount = false) { console.log(`approve ${token.address} to ${approvalAddress}`); if (token.isNative) { return; } // check if approvalAddress has enough allowance const approvedAmount = await readAllowance(signer, token.address, approvalAddress); if (approvedAmount.gte(bignumber_1.BigNumber.from(amount.toString()))) { console.log('already approved'); return; } // if not enough, do approve const approvingAmount = unlimitedAmount ? ethers_1.constants.MaxUint256.toString() : amount; const approveTx = await doApprove(signer, token.address, approvalAddress, approvingAmount); await approveTx.wait(); } exports.approveToken = approveToken; async function revokeTokenApproval(signer, token, approvalAddress) { if (token.isNative) { return; } const approvedAmount = await readAllowance(signer, token.address, approvalAddress); if (approvedAmount.isZero()) return; const approveTx = await doApprove(signer, token.address, approvalAddress, '0'); await approveTx.wait(); } exports.revokeTokenApproval = revokeTokenApproval;