butterjs-sdk
Version:
Butter Network SDK
74 lines (73 loc) • 2.96 kB
JavaScript
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;
;