UNPKG

@devasher/kuru-sdk

Version:

Ethers v6 SDK to interact with Kuru (forked from @kuru-labs/kuru-sdk)

124 lines 4.98 kB
"use strict"; 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