@devasher/kuru-sdk
Version:
Ethers v6 SDK to interact with Kuru (forked from @kuru-labs/kuru-sdk)
124 lines • 4.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAllowance = exports.estimateApproveGas = exports.approveToken = exports.constructApproveTransaction = void 0;
// ============ External Imports ============
const ethers_1 = require("ethers");
// ============ Internal Imports ============
const utils_1 = require("../utils");
const IERC20_json_1 = __importDefault(require("../../abi/IERC20.json"));
const txConfig_1 = __importDefault(require("./txConfig"));
const getOwnerAddress = async (providerOrSigner) => {
if (providerOrSigner instanceof ethers_1.ethers.JsonRpcProvider) {
return await (await providerOrSigner.getSigner()).getAddress();
}
return await providerOrSigner.getAddress();
};
/**
* @dev Constructs a transaction to approve token spending.
* @param signer - The signer instance.
* @param tokenContractAddress - The token contract address.
* @param approveTo - EOA/Contract address of spender.
* @param size - The amount of tokens to approve.
* @param txOptions - Optional transaction parameters.
* @returns A promise that resolves to the transaction request object.
*/
async function constructApproveTransaction(signer, tokenContractAddress, approveTo, size, txOptions) {
const address = await signer.getAddress();
const tokenInterface = new ethers_1.ethers.Interface(IERC20_json_1.default.abi);
const data = tokenInterface.encodeFunctionData('approve', [approveTo, size]);
return (0, txConfig_1.default)({
to: tokenContractAddress,
from: address,
data,
txOptions,
signer,
});
}
exports.constructApproveTransaction = constructApproveTransaction;
/**
* @dev Approves a token for spending by the market contract.
* @param tokenContract - The token contract instance.
* @param approveTo - EOA/Contract address of spender.
* @param size - The amount of tokens to approve.
* @param providerOrSigner - The provider or signer to use for the transaction.
* @param txOptions - Optional transaction parameters.
* @param waitForReceipt - Whether to wait for the transaction receipt.
* @returns A promise that resolves when the transaction is confirmed.
*/
async function approveToken(tokenContract, approveTo, size, providerOrSigner, txOptions, waitForReceipt = true) {
try {
const ownerAddress = await getOwnerAddress(providerOrSigner);
const existingApproval = await tokenContract.allowance(ownerAddress, approveTo);
if (existingApproval >= size) {
console.log('Approval already exists');
return null;
}
// Get signer from provider if needed
let signer;
try {
signer = (await providerOrSigner.getAddress())
? providerOrSigner
: await providerOrSigner.getSigner();
}
catch (_a) {
signer = await providerOrSigner.getSigner();
}
const tx = await constructApproveTransaction(signer, await tokenContract.getAddress(), approveTo, size, txOptions);
const transaction = await signer.sendTransaction(tx);
if (!waitForReceipt) {
return transaction.hash;
}
const receipt = await transaction.wait(1);
if (!receipt) {
throw new Error('Transaction failed');
}
return receipt.hash;
}
catch (e) {
console.error({ e });
if (!e.error) {
throw e;
}
throw (0, utils_1.extractErrorMessage)(e);
}
}
exports.approveToken = approveToken;
async function estimateApproveGas(tokenContract, approveTo, size) {
try {
const gasEstimate = await tokenContract.approve.estimateGas(approveTo, size);
return gasEstimate;
}
catch (e) {
if (!e.error) {
throw e;
}
throw (0, utils_1.extractErrorMessage)(e);
}
}
exports.estimateApproveGas = estimateApproveGas;
/**
* @dev Gets the token allowance for a specific owner and spender.
* @param tokenAddress - The token contract address.
* @param ownerAddress - The address of the token owner.
* @param spenderAddress - The address of the spender.
* @param provider - The provider instance to use for the query.
* @returns A promise that resolves to the current allowance as a bigint.
*/
async function getAllowance(tokenAddress, ownerAddress, spenderAddress, provider) {
try {
const tokenContract = new ethers_1.ethers.Contract(tokenAddress, IERC20_json_1.default.abi, provider);
const allowance = await tokenContract.allowance(ownerAddress, spenderAddress);
return allowance;
}
catch (e) {
if (!e.error) {
throw e;
}
throw (0, utils_1.extractErrorMessage)(e);
}
}
exports.getAllowance = getAllowance;
//# sourceMappingURL=approve.js.map